好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

php中try catch 捕获异常的例 - php高级应用

php中try catch 捕获异常的例

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(){  //这里可以捕获到前面一个块抛出的Exception   } 

为了进一步处理异常,我们需要使用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{              //重定义构造器使第一个参数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>" ;             } //开源软件:phpfensi.com       var_dump( $testObj2 );         //有异常产生,这个对象没有创建成功   ?> 

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

查看更多关于php中try catch 捕获异常的例 - php高级应用的详细内容...

  阅读:40次