php中try catch捕获异常实例详解
《php中try catch捕获异常实例详解》要点: PHP教程本篇章节讲解php中try catch捕获异常.分享给大家供大家参考.具体办法分析如下: PHP教程php中try catch可以赞助我们捕获程序代码的异常了,这样我们可以很好的处理一些不必要的错误了,感兴趣的朋友可以一起来看看. PHP教程PHP中try{}catch{}语句概述 PHP教程PHP5添加了类似于其它语言的异常处理模块.在 PHP 代码中所产生的异常可被 throw语句抛出并被 catch 语句捕获.(注:一定要先抛才能获取) PHP教程需要进行异常处理的代码都必须放入 try 代码块内,以便捕获可能存在的异常. PHP教程每一个 try 至少要有一个与之对应的 catch. PHP教程使用多个 catch可以捕获不同的类所产生的异常. PHP教程当 try 代码块不再抛出异常或者找不到 catch 能匹配所抛出的异常时,PHP 代码就会在跳转到最后一个 catch 的后面继续执行. PHP教程当然,PHP允许在 catch 代码块内再次抛出(throw)异常. PHP教程当一个异常被抛出时,其后(译者注:指抛出异常时所在的代码块)的代码将不会继续执行,而 PHP 就会尝试查找第一个能与之匹配的 catch. PHP教程如果一个异常没有被捕获,而且又没用使用 set_exception_handler() 作相应的处理的话,那么 PHP 将会产生一个严重的错误,并且输出 Uncaught Exception ... (未捕获异常)的提示信息. PHP教程先来看一下PHP内置异常类的基本属性和办法.(不包括具体实现)
代码如下:
try{
} catch(){ throw new Exception(); } catch(){ //这里可以捕获到前面一个块抛出的Exception } PHP教程为了进一步处理异常,我们需要使用PHP中try{}catch{}----包括Try语句和至少一个的catch语句.任何调用 可能抛出异常的办法的代码都应该使用try语句.Catch语句用来处理可能抛出的异常.以下显示了我们处理getCommandObject()抛出的异常的办法:
代码如下:
<?php
try { $mgr = new CommandManager(); $cmd = $mgr->getCommandObject("realcommand"); $cmd->execute(); } catch (Exception $e) { print $e->getMessage(); exit(); } ?> 可以看到,通过结合使用throw关键字和PHP中try{}catch{},我们可以避免错误标记“污染”类办法返回的值.因为“异常”本身就是一种与其它任何对象不同的PHP内建的类型,不会产生混淆. PHP教程如果抛出了一个异常,try语句中的脚本将会停止执行,然后马上转向执行catch语句中的脚本. PHP教程例子如下: PHP教程包含文件错误抛出异常
代码如下:
<?php
// 错误的演示 try { require ('test_try_catch.php'); } catch (Exception $e) { echo $e->getMessage(); } PHP教程// 正确的抛出异常 如果异常抛出了却没有被捕捉到,就会产生一个fatal error. PHP教程多个catch捕获多个异常 PHP教程PHP将查询一个匹配的catch代码块.如果有多个catch代码块,传递给每一个catch代码块的对象必须具有不同类型,这样PHP可以找到需要进入哪一个catch代码块.当try代码块不再抛出异常或者找不到catch能匹配所抛出的异常时,PHP代码就会在跳转最后一个catch的后面继续执行.多个异常的捕获的示例如下:
代码如下:
<?php
??? 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."<br>"; ?????????? } ?????????? //为这个异常自定义一个处理办法 ?????????? 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 "********<br>";???????????????????? //没有抛出异常这条语句就会正常执行 ??? }catch(MyException $e){????????????????????? //捕获用户自定义的异常区块 ??????? echo "捕获自定义的异常:$e<br>";????????? //按自定义的方式输出异常消息 ??????? $e->customFunction();??????????????????? //可以调用自定义的异常处理办法 ??? }catch(Exception $e){??????????????????????? //捕获PHP内置的异常处理类的对象 ??????? echo "捕获默认的异常:".$e->getMessage()."<br>";?????? //输出异常消息 ??? } ??? var_dump($testObj);??????? //判断对象是否创建成功,如果没有任何异常,则创建成功 ? ??? //示例2,抛出自定义的异常,并通过自定义的异常处理类捕获这个异常并处理 ??? try{ ??????? $testObj1 =new TestException(1);???????? //传1时,抛出自定义异常 ??????? echo "********<br>";???????????????????? //这个语句不会被执行 ??? }catch(MyException $e){????????????????????? //这个catch区块中的代码将被执行 ??????? echo "捕获自定义的异常:$e<br>";????????? ??????? $e->customFunction();??????????????????? ??? }catch(Exception $e){??????????????????????? //这个catch区块不会执行 ??????? echo "捕获默认的异常:".$e->getMessage()."<br>";?????? ??? } ??? var_dump($testObj1);??????? //有异常产生,这个对象没有创建成功 ? ??? //示例2,抛出自内置的异常,并通过自定义的异常处理类捕获这个异常并处理 ??? try{ ??????? $testObj2 =new TestException(2);???????? //传入2时,抛出内置异常 ??????? echo "********<br>";???????????????????? //这个语句不会被执行 ??? }catch(MyException $e){????????????????????? //这个catch区块中的代码将被执行 ??????? echo "捕获自定义的异常:$e<br>";????????? ??????? $e->customFunction();??????????????????? ??? }catch(Exception $e){??????????????????????? //这个catch区块不会执行 ??????? echo "捕获默认的异常:".$e->getMessage()."<br>";?????? ??? } ??? var_dump($testObj2);??????? //有异常产生,这个对象没有创建成功 ?> PHP教程在上面的代码中,可以使用两个异常处理类:一个是自定义的异常处理类MyException;另一个则是PHP中内置的异常处理类Exception.分别在try区块中创建测试类TestException的对象,并根据构造办法中提供的不同数字参数,抛出自定义异常类对象、内置的异常类对象和不抛出任何异常的情况,跳转到对应的catch区块中执行.如果没有异常发生,则不会进入任何一个catch块中执行,测试类TestException的对象创建成功 PHP教程希望本文所述对大家的php程序设计有所赞助. 欢迎参与《php中try catch捕获异常实例详解》讨论,分享您的想法,编程之家 52php.cn为您提供专业教程。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |