php try 中 抛出异常处理,php中try catch捕获异常实例详解

php中try catch可以帮助我们捕获程序代码的异常了,这样我们可以很好的处理一些不必要的错误了,感兴趣的朋友可以一起来看看。

PHP中try{}catch{}语句概述

PHP5添加了类似于其它语言的异常处理模块。在 PHP 代码中所产生的异常可被 throw语句抛出并被 catch 语句捕获。(注:一定要先抛才能获取)

需要进行异常处理的代码都必须放入 try 代码块内,以便捕获可能存在的异常。

每一个 try 至少要有一个与之对应的 catch。

使用多个 catch可以捕获不同的类所产生的异常。

当 try 代码块不再抛出异常或者找不到 catch 能匹配所抛出的异常时,PHP 代码就会在跳转到最后一个 catch 的后面继续执行。

当然,PHP允许在 catch 代码块内再次抛出(throw)异常。

当一个异常被抛出时,其后(译者注:指抛出异常时所在的代码块)的代码将不会继续执行,而 PHP 就会尝试查找第一个能与之匹配的 catch。

如果一个异常没有被捕获,而且又没用使用 set_exception_handler() 作相应的处理的话,那么 PHP 将会产生一个严重的错误,并且输出 Uncaught Exception ... (未捕获异常)的提示信息。

先来看一下PHP内置异常类的基本属性和方法。(不包括具体实现)

复制代码 代码如下: try{

}

catch(){

throw new Exception();

}

catch(){

//这里可以捕获到前面一个块抛出的Exception

}

为了进一步处理异常,我们需要使用PHP中try{}catch{}----包括Try语句和至少一个的catch语句。任何调用 可能抛出异常的方法的代码都应该使用try语句。Catch语句用来处理可能抛出的异常。以下显示了我们处理getCommandObject()抛出的异常的方法:

复制代码 代码如下: try {

$mgr = new CommandManager();

$cmd = $mgr->getCommandObject("realcommand");

$cmd->execute();

} catch (Exception $e) {

print $e->getMessage();

exit();

}

?>

可以看到,通过结合使用throw关键字和PHP中try{}catch{},我们可以避免错误标记“污染”类方法返回的值。因为“异常”本身就是一种与其它任何对象不同的PHP内建的类型,不会产生混淆。

如果抛出了一个异常,try语句中的脚本将会停止执行,然后马上转向执行catch语句中的脚本。

例子如下:

包含文件错误抛出异常

复制代码 代码如下: // 错误的演示

try {

require ('test_try_catch.php');

} catch (Exception $e) {

echo $e->getMessage();

}

// 正确的抛出异常

try {

if (file_exists('test_try_catch.php')) {

require ('test_try_catch.php');

} else {

throw new Exception('file is not exists');

}

} catch (Exception $e) {

echo $e->getMessage();

}

如果异常抛出了却没有被捕捉到,就会产生一个fatal error。

多个catch捕获多个异常

PHP将查询一个匹配的catch代码块。如果有多个catch代码块,传递给每一个catch代码块的对象必须具有不同类型,这样PHP可以找到需要进入哪一个catch代码块。当try代码块不再抛出异常或者找不到catch能匹配所抛出的异常时,PHP代码就会在跳转最后一个catch的后面继续执行。多个异常的捕获的示例如下:

复制代码 代码如下: class MyException extends Exception{

//重定义构造器使第一个参数message变为必须被指定的属性

public function __construct($message, $code=0){

//可以在这里定义一些自己的代码

//建议同时调用parent::construct()来检查所有的变量是否已被赋值

parent::__construct($message, $code);

}

//重写父类中继承过来的方法,自定义字符串输出的样式

public function __toString(){

return __CLASS__.":[".$this->code."]:".$this->message."

";

}

//为这个异常自定义一个处理方法

public function customFunction(){

echo "按自定义的方法处理出现的这个类型的异常";

}

}

//创建一个用于测试自定义扩展的异常类MyException

class TestException{

public $var; //用来判断对象是否创建成功的成员属性

function __construct($value=0){ //通过构造方法的传值决定抛出的异常

switch($value){ //对传入的值进行选择性的判断

case 1: //掺入参数1,则抛出自定义的异常对象

throw new MyException("传入的值“1”是一个无效的参数",5);break;

case 2: //传入参数2,则抛出PHP内置的异常对象

throw new MyException("传入的值“2”不允许作为一个参数",6);break;

default: //传入参数合法,则不抛出异常

$this->var=$value;break; //为对象中的成员属性赋值

}

}

}

//示例1,在没有异常时,程序正常执行,try中的代码全部执行并不会执行任何catch区块

try{

$testObj =new TestException(); //使用默认参数创建异常的擦拭类对象

echo "********

"; //没有抛出异常这条语句就会正常执行

}catch(MyException $e){ //捕获用户自定义的异常区块

echo "捕获自定义的异常:$e

"; //按自定义的方式输出异常消息

$e->customFunction(); //可以调用自定义的异常处理方法

}catch(Exception $e){ //捕获PHP内置的异常处理类的对象

echo "捕获默认的异常:".$e->getMessage()."

"; //输出异常消息

}

var_dump($testObj); //判断对象是否创建成功,如果没有任何异常,则创建成功

//示例2,抛出自定义的异常,并通过自定义的异常处理类捕获这个异常并处理

try{

$testObj1 =new TestException(1); //传1时,抛出自定义异常

echo "********

"; //这个语句不会被执行

}catch(MyException $e){ //这个catch区块中的代码将被执行

echo "捕获自定义的异常:$e

";

$e->customFunction();

}catch(Exception $e){ //这个catch区块不会执行

echo "捕获默认的异常:".$e->getMessage()."

";

}

var_dump($testObj1); //有异常产生,这个对象没有创建成功

//示例2,抛出自内置的异常,并通过自定义的异常处理类捕获这个异常并处理

try{

$testObj2 =new TestException(2); //传入2时,抛出内置异常

echo "********

"; //这个语句不会被执行

}catch(MyException $e){ //这个catch区块中的代码将被执行

echo "捕获自定义的异常:$e

";

$e->customFunction();

}catch(Exception $e){ //这个catch区块不会执行

echo "捕获默认的异常:".$e->getMessage()."

";

}

var_dump($testObj2); //有异常产生,这个对象没有创建成功

?>

相关报道:

在过去,我们如果想在Web上播放视频,也是都是通过Flash来播放,同样并不是所有的 浏览器 都安装了Flash播放器插件,而现在我们在HTML5中,就能完全脱离Flash或其他的插件来播放视频了 1、视频格式的简单介绍 视频格式:avi、rmb、wmv、mpeg4、ogg、webm 视 更多

DNS是网络应用的基础设施,它的安全性对于互联网的安全有着举足轻重的影响。对于经常使用电脑或者信息设备的人来说,经常会在网络设置中看到DNS。但是对于普通大众来说,DNS是非常陌生的。而在这个信息技术和互联网飞速发展的时代,陌生和不熟悉就意味不安全 更多

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值