加入收藏 | 设为首页 | 会员中心 | 我要投稿 南平站长网 (https://www.0599zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php里try catch 捕获异常的例

发布时间:2022-02-18 17:49:11 所属栏目:PHP教程 来源:互联网
导读:php中try catch可以帮助我们捕获程序代码的异常了,这样我们可以很好的处理一些不必要的错误了,下面本文章总结了捕获异常的一些用法例子. PHP中try{}catch{}语句. PHP 5 添加了类似于其它语言的异常处理模块,在 PHP 代码中所产生的异常可被 throw语句抛出并
  php中try catch可以帮助我们捕获程序代码的异常了,这样我们可以很好的处理一些不必要的错误了,下面本文章总结了捕获异常的一些用法例子.
 
  PHP中try{}catch{}语句.
 
  PHP 5 添加了类似于其它语言的异常处理模块,在 PHP 代码中所产生的异常可被 throw语句抛出并被 catch 语句捕获,注,一定要先抛才能获取.
 
 
  先来看一下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>";        
      }//开源软件:Cuoxin.com
      var_dump($testObj2);        //有异常产生,这个对象没有创建成功
  ?>
  在上面的代码中,可以使用两个异常处理类:一个是自定义的异常处理类MyException;另一个则是PHP中内置的异常处理类Exception,分别在try区块中创建测试类TestException的对象,并根据构造方法中提供的不同数字参数,抛出自定义异常类对象、内置的异常类对象和不抛出任何异常的情况,跳转到对应的catch区块中执行,如果没有异常发生,则不会进入任何一个catch块中执行,测试类TestException的对象创建成功.

(编辑:南平站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读