当前位置:首页 > PHP教程 > php高级应用 > 列表

php中try catch捕获异常实例详解

发布:smiling 来源: PHP粉丝网  添加日期:2021-04-28 16:50:52 浏览: 评论:0 

这篇文章主要介绍了php中try catch捕获异常的用法,以实例形式详细分析了捕获一个异常与捕获多个异常的方法,有助于更好的处理一些不必要的错误,具有一定的实用价值,需要的朋友可以参考下

本文实例讲述了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内置异常类的基本属性和方法,(不包括具体实现)代码如下:

  1. try{ 
  2. catch(){ 
  3. throw new Exception(); 
  4. catch(){ 
  5. //这里可以捕获到前面一个块抛出的Exception 

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

  1. <?php 
  2. try { 
  3. $mgr = new CommandManager(); 
  4. $cmd = $mgr->getCommandObject("realcommand"); 
  5. $cmd->execute(); 
  6. } catch (Exception $e) { 
  7. print $e->getMessage(); 
  8. exit(); 
  9. ?> 

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

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

例子如下:

包含文件错误抛出异常,代码如下:

  1. <?php 
  2. // 错误的演示 
  3. try { 
  4. require ('test_try_catch.php'); 
  5. } catch (Exception $e) { 
  6. echo $e->getMessage(); 
  7. // 正确的抛出异常 
  8. try { 
  9. if (file_exists('test_try_catch.php')) { 
  10. require ('test_try_catch.php'); 
  11. else { 
  12. throw new Exception('file is not exists'); 
  13. } catch (Exception $e) { 
  14. echo $e->getMessage(); 

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

多个catch捕获多个异常

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

  1. <?php 
  2.     class MyException extends Exception{ 
  3.            //重定义构造器使第一个参数message变为必须被指定的属性 
  4.            public function __construct($message$code=0){ 
  5.                //可以在这里定义一些自己的代码 
  6.                //建议同时调用parent::construct()来检查所有的变量是否已被赋值 
  7.                parent::__construct($message$code); 
  8.            } 
  9.            //重写父类中继承过来的方法,自定义字符串输出的样式 
  10.            public function __toString(){ 
  11.                return __CLASS__.":[".$this->code."]:".$this->message."<br>"
  12.            } 
  13.            //为这个异常自定义一个处理方法 
  14.            public function customFunction(){ 
  15.                echo "按自定义的方法处理出现的这个类型的异常"
  16.            } 
  17.     } 
  18.  
  19.     //创建一个用于测试自定义扩展的异常类MyException 
  20.     class TestException{ 
  21.         public $var;           //用来判断对象是否创建成功的成员属性 
  22.         function __construct($value=0){              //通过构造方法的传值决定抛出的异常 
  23.             switch($value){                          //对传入的值进行选择性的判断 
  24.                 case 1:                              //掺入参数1,则抛出自定义的异常对象 
  25.                     throw new MyException("传入的值“1”是一个无效的参数",5);break
  26.                 case 2:                              //传入参数2,则抛出PHP内置的异常对象 
  27.                     throw new MyException("传入的值“2”不允许作为一个参数",6);break
  28.                 default:                             //传入参数合法,则不抛出异常 
  29.                     $this->var=$value;break;          //为对象中的成员属性赋值 
  30.             } 
  31.         } 
  32.     } 
  33.  
  34.     //示例1,在没有异常时,程序正常执行,try中的代码全部执行并不会执行任何catch区块 
  35.     try{ 
  36.         $testObj =new TestException();           //使用默认参数创建异常的擦拭类对象 
  37.         echo "********<br>";                     //没有抛出异常这条语句就会正常执行 
  38.     }catch(MyException $e){                      //捕获用户自定义的异常区块 
  39.         echo "捕获自定义的异常:$e<br>";          //按自定义的方式输出异常消息 
  40.         $e->customFunction();                    //可以调用自定义的异常处理方法 
  41.     }catch(Exception $e){                        //捕获PHP内置的异常处理类的对象 
  42.         echo "捕获默认的异常:".$e->getMessage()."<br>";       //输出异常消息 
  43.     } 
  44.     var_dump($testObj);        //判断对象是否创建成功,如果没有任何异常,则创建成功 
  45.  
  46.     //示例2,抛出自定义的异常,并通过自定义的异常处理类捕获这个异常并处理 
  47.     try{ 
  48.         $testObj1 =new TestException(1);         //传1时,抛出自定义异常 
  49.         echo "********<br>";                     //这个语句不会被执行 
  50.     }catch(MyException $e){                      //这个catch区块中的代码将被执行 
  51.         echo "捕获自定义的异常:$e<br>";          
  52.         $e->customFunction();                    
  53.     }catch(Exception $e){                        //这个catch区块不会执行 
  54.         echo "捕获默认的异常:".$e->getMessage()."<br>";       
  55.     } 
  56.     var_dump($testObj1);        //有异常产生,这个对象没有创建成功 
  57.  
  58.     //示例2,抛出自内置的异常,并通过自定义的异常处理类捕获这个异常并处理 
  59.     try{ 
  60.         $testObj2 =new TestException(2);         //传入2时,抛出内置异常 
  61.         echo "********<br>";                     //这个语句不会被执行 
  62.     }catch(MyException $e){                      //这个catch区块中的代码将被执行 
  63.         echo "捕获自定义的异常:$e<br>";          
  64.         $e->customFunction();                    
  65.     }catch(Exception $e){                        //这个catch区块不会执行 
  66.         echo "捕获默认的异常:".$e->getMessage()."<br>";       
  67.     } 
  68.     var_dump($testObj2);        //有异常产生,这个对象没有创建成功 
  69. ?> 

在上面的代码中,可以使用两个异常处理类:一个是自定义的异常处理类MyException;另一个则是PHP中内置的异常处理类Exception。分别在try区块中创建测试类TestException的对象,并根据构造方法中提供的不同数字参数,抛出自定义异常类对象、内置的异常类对象和不抛出任何异常的情况,跳转到对应的catch区块中执行。如果没有异常发生,则不会进入任何一个catch块中执行,测试类TestException的对象创建成功。

希望本文所述对大家的php程序设计有所帮助。

Tags: try catch捕获异常

分享到: