php中try catch可以帮助我们捕获程序代码的异常了,这样我们可以很好的处理一些不必要的错误了,下面本文章总结了捕获异常的一些用法例子.
PHP中try{}catch{}语句.
PHP 5 添加了类似于其它语言的异常处理模块,在 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(){
-
- }
为了进一步处理异常,我们需要使用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内建的类型,不会产生混淆.
如果抛出了一个异常,try语句中的脚本将会停止执行,然后马上转向执行catch语句中的脚本.
例子如下,包含文件错误抛出异常,代码如下:
- <?php
-
- 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的后面继续执行,多个异常的捕获的示例如下,代码如下:
- <?php
- class MyException extends Exception{
-
- public function __construct($message, $code=0){
-
-
- parent::__construct($message, $code);
- }
-
- public function __toString(){
- return __CLASS__.":[".$this->code."]:".$this->message."<br>";
- }
-
- public function customFunction(){
- echo "按自定义的方法处理出现的这个类型的异常";
- }
- }
-
-
- class TestException{
- public $var;
- function __construct($value=0){
- switch($value){
- case 1:
- throw new MyException("传入的值“1”是一个无效的参数",5);break;
- case 2:
- throw new MyException("传入的值“2”不允许作为一个参数",6);break;
- default:
- $this->var=$value;break;
- }
- }
- }
-
-
- try{
- $testObj =new TestException();
- echo "********<br>";
- }catch(MyException $e){
- echo "捕获自定义的异常:$e<br>";
- $e->customFunction();
- }catch(Exception $e){
- echo "捕获默认的异常:".$e->getMessage()."<br>";
- }
- var_dump($testObj);
-
-
- try{
- $testObj1 =new TestException(1);
- echo "********<br>";
- }catch(MyException $e){
- echo "捕获自定义的异常:$e<br>";
- $e->customFunction();
- }catch(Exception $e){
- echo "捕获默认的异常:".$e->getMessage()."<br>";
- }
- var_dump($testObj1);
-
-
- try{
- $testObj2 =new TestException(2);
- echo "********<br>";
- }catch(MyException $e){
- echo "捕获自定义的异常:$e<br>";
- $e->customFunction();
- }catch(Exception $e){
- echo "捕获默认的异常:".$e->getMessage()."<br>";
- }
- var_dump($testObj2);
- ?>
在上面的代码中,可以使用两个异常处理类:一个是自定义的异常处理类MyException;另一个则是PHP中内置的异常处理类Exception,分别在try区块中创建测试类TestException的对象,并根据构造方法中提供的不同数字参数,抛出自定义异常类对象、内置的异常类对象和不抛出任何异常的情况,跳转到对应的catch区块中执行,如果没有异常发生,则不会进入任何一个catch块中执行,测试类TestException的对象创建成功. |