`
flf592ap
  • 浏览: 13890 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

PHP5的异常处理机制(二)

 
阅读更多

PHP5的异常处理机制(二)
2011年12月15日
  根据我们以上讨论的,PHP内建的异常类需要有以下成员方法: __construct() 构造函数,需要一个出错信息和一个可选的整型错误标记作参数 getMessage() 取得出错信息 getCode() 出错的代码 getFile() 异常发生的文件 getLine() 异常发生的行数 getTrace()  跟踪异常每一步传递的路线,存入数组,返回该数组 getTraceAsString() 和getTrace()功能一样,但可以将数组中的元素转成字符串并按一定格式输出 可以看出来,Exception类的结构和Pear_Error很相似。当你的脚本中遇到一个错误,你可以建立你的异常对象: $ex = new Exception( "Could not open $this->file" ); Exception类的构造函数将接受一个出错信息和一个错误代码。
  建立一个Exception对象后你可以将对象返回,但不应该这样使用,更好的方法是用throw关键字来代替。throw用来抛出异常: throw new Exception( "my message", 44 ); throw将脚本的执行中止,并使相关的Exception对象对客户代码可用。
  以下是改进过的getCommandObject()方法
  index_php5.php cmdDir}/{$cmd}.php";
  if (!file_exists($path)) {
  throw newException("Cannot find $path");
  }
  require_once$path;
  if (!class_exists($cmd)) {
  throw newException(
  "class $cmd does not exist");
  }
  $class= newReflectionClass($cmd);
  if (!$class->isSubclassOf(newReflectionClass('Command'))) {
  throw newException("$cmd is not a Command");
  }
  return new$cmd();
  }
  }
  ?> 代码中我们使用了PHP5的反射(Reflection)API来判断所给的类是否是属于Command类型。在错误的路径下执行本脚本将会报出这样的错误: Fatal error: Uncaught exception 'Exception' with message 'Cannot find command/xrealcommand.php' in /home/xyz/BasicException.php:10
  Stack trace:
  #0 /home/xyz/BasicException.php(26):
  CommandManager->getCommandObject('xrealcommand')
  #1 {main}
  thrown in /home/xyz/BasicException.php on line 10 默认地,抛出异常导致一个fatal error。这意味着使用异常的类内建有安全机制。而仅仅使用一个错误标记,不能拥有这样的功能。处理错误标记失败只会你的脚本使用错误的值来继续执行。
  为了进一步处理异常,我们需要使用try-catch语句―包括Try语句和至少一个的catch语句。任何调用可能抛出异常的方法的代码都应该使用try语句。Catch语句用来处理可能抛出的异常。以下显示了我们处理getCommandObject()抛出的异常的方法: index_php5.php后半段 getCommandObject('realcommand');
  $cmd->execute();
  } catch (Exception $e) {
  print$e->getMessage();
  exit();
  }
  ?> 可以看到,通过结合使用throw关键字和try-catch语句,我们可以避免错误标记“污染”类方法返回的值。因为“异常”本身就是一种与其它任何对象不同的PHP内建的类型,不会产生混淆。
  如果抛出了一个异常,try语句中的脚本将会停止执行,然后马上转向执行catch语句中的脚本。
  如果异常抛出了却没有被捕捉到,就会产生一个fatal error。
  在目前为止异常处理看起来和我们传统的作法―检验返回的错误标识或对象的值没有什么太大区别。让我们将CommandManager处理地更谨慎,并在构造函数中检查command目录是否存在。 index_php5_2.php cmdDir)) {
  throw newException(
  "directory error: $this->cmdDir");
  }
  }
  functiongetCommandObject($cmd) {
  $path="{$this->cmdDir}/{$cmd}.php";
  if (!file_exists($path)) {
  throw newException("Cannot find $path");
  }
  require_once$path;
  if (!class_exists($cmd)) {
  throw newException("class $cmd does not exist");
  }
  $class= newReflectionClass($cmd);
  if (!$class->isSubclassOf(newReflectionClass('Command'))) {
  throw newException("$cmd is not a Command");
  }
  return new$cmd();
  }
  }
  ?> 这里有两个地方的调用可能导致程序出错(__construct()getCommandObject())。尽管如此,我们不需要调整我们的客户代码。你可以在try语句中增添众多内容,然后在catch中统一处理。如果CommandManager对象的构造函数抛出一个异常,则try语句中的执行中止,然后catch语句被调用捕捉相关的异常。同样地,getCommandObject()也是如此。这样,我们有同时存在两个潜在的引发错误的地方,和一个唯一的语句来处理所有的错误。这让我们的代码看起来更加整洁,又可以满足错误处理的要求。和前面提到的PHP的传统的错误方法相比,显然很有优势。 index_php5_2.php后半段
  注意:尽管和index_php5.php相比,前半段代码有两个可能出错的地方,这段代码和index_php5.php的后半段完全相同。 error
  $cmd=$mgr->getCommandObject('realcommand');
  // another potential error
  $cmd->execute();
  } catch (Exception $e) {
  // handle either error here
  print$e->getMessage();
  exit();
  }
  ?> 还有一个地方我们没有提到。我们怎样区分不同类型的错误?例如,我们可能希望用一种方法来处理找不到目录的错误,而用另一种方法来处理非法的command类。
  Exception类可以接受一个可选的整型的错误标识,这是在catch语句中区分不同错误类型的一个方法。 index_php5_3.php cmdDir)) {
  throw newException("directory error: $this->cmdDir",self::CMDMAN_GENERAL_ERROR);
  }
  }
  functiongetCommandObject($cmd) {
  $path="{$this->cmdDir}/{$cmd}.php";
  if (!file_exists($path)) {
  throw newException("Cannot find $path",self::CMDMAN_ILLEGALCLASS_ERROR);
  }
  require_once$path;
  if (!class_exists($cmd)) {
  throw newException("class $cmd does not exist",self::CMDMAN_ILLEGALCLASS_ERROR);
  }
  $class= newReflectionClass($cmd);
  if (!$class->isSubclassOf(newReflectionClass('Command'))) {
  throw newException("$cmd is not a Command",self::CMDMAN_ILLEGALCLASS_ERROR);
  }
  return$class->newInstance();
  }
  }
  ?>
分享到:
评论

相关推荐

    详细解读php的异常处理机制-参考源码

    详细解读php的异常处理机制-参考源码

    PHP中的异常处理机制深入讲解

    异常(Exception)是一种错误处理机制,用于在指定的错误发生时改变脚本的正常流程。 当异常被触发时,当前代码状态被保存,代码执行被切换到预定义的异常处理器函数(如果有) 根据情况,处理器也许会从保存的代码...

    php错误、异常处理机制(补充)

    一、错误处理 异常处理: 意外,是在程序运行过程中发生的意料这外的事,使用异常改变脚本正常流程 PHP5中的一个新的重要特性 复制代码 代码如下: if(){ }else{ } try { }catch(异常对象){ } 1. 如果try中代码没有...

    深入理解golang的异常处理机制

    众所周知在java或php等很多面向对象的语言中, 异常处理是依靠throw、catch来进行的。在go语言中,panic和recover函数在作用层面分别对等throw和catch语句,当然也存在不同之处。下面话不多说,来一起看看详细的介绍...

    PHP中异常处理的一些方法整理

    第一个是嵌套异常第二是一套SPL(现在的PHP运行机制的一个核心扩展)的扩展的新的异常类型。这两个新特性,这本书里都能找到最佳实践值得各位去详细研究。 特别要注意:这些特性中的一些已经存在于低于5.3的PHP版本...

    PHP中的错误处理、异常处理机制分析

    例: 复制代码 代码如下: <?php $a = fopen(... 一、PHP错误处理的三种方式A、简单的die()语句; 等价于exit(); 例: 复制代码 代码如下: if(!file_exists(‘aa.txt’)){ die(‘文件不存在’); } else { /

    基于PHP7错误处理与异常处理方法(详解)

    不同于传统(PHP 5)的错误报告机制,现在大多数错误被作为 Error 异常抛出。 这种 Error 异常可以像 Exception 异常一样被第一个匹配的 try / catch 块所捕获。如果没有匹配的 catch 块,则调用异常处理函数(事先...

    PHP编程网络大讲堂

    PHP数据处理篇(第5~10章),介绍在Web页面、字符串、函数、正则表达以及数组中的处理,PHP中的异常处理机制等;PHP高级进阶篇(第11~15章),介绍MySQL知识,通过PHP操作MySQL数据库,操作XML、文件、目录以及...

    php7 错误处理机制修改实例分析

    本文实例讲述了php7 错误处理机制修改。分享给大家供大家参考,具体如下: 一、现在有两个异常类:Exception and Error. PHP7现在有两个异常类,Exception and Error。这两个类都实现了一个新的接口:Throwable。在...

    php5手册.chm

    异常处理 生成器 引用的解释 预定义变量 预定义异常 预定义接口 上下文(Context)选项和参数 支持的协议和封装协议 安全 简介 总则 以 CGI 模式安装时 以 Apache 模块安装时 文件系统安全 数据库安全 错误报告 使用...

    PHP 错误处理机制

    在日常的项目开发过程中,总是会出现一些我们意想不到的异常错误,如果我们对此没有进行相对完善的处理,...PHP正常情况下,错误会正常的输出,但在一些框架中,可能会影响错误的输出,可能是框架本身有自己的处理机制

    php5中文手册20111124

    异常处理 引用的解释 预定义变量 预定义异常 预定义接口 Context options and parameters Supported Protocols and Wrappers 安全 简介 总则 以 CGI 模式安装时 以 Apache 模块安装时 文件系统安全 数据库安全 错误...

    PHP Web开发学习实录PDF下载

    PHP数据处理篇包括第4-8章,介绍了PHP中的异常处理机制、字符串、正则表达式、网页之间的通信技术、表单处理和文件处理等;PHP应用篇包括第9-13章,介绍了PHP与MySQL数据库之间的交互、PHP的安全技术、与XML的交互、...

    PHP5最新中文手册CHM(2013年10月更新)

    ■异常处理 ■生成器 ■引用的解释 ■预定义变量 ■预定义异常 ■预定义接口 ■上下文(Context)选项和参数 ■支持的协议和封装协议 ■安全 ■简介 ■总则 ■以 CGI 模式安装时 ■以 Apache 模块安装时 ■文件系统...

    php异常:Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACEeval()d code error

    php中try catch捕获异常实例详解PHP异常Parse error: syntax error, unexpected T_VAR错误解决方法PHP的异常处理类Exception的使用及说明php Try Catch异常测试PHP如何抛出异常处理错误php中异常处理方法小结PHP中的...

    php权威编程

    3.18 异常处理 3.19 ___autoloadO 3.20 在函数参数中提示类的类别 3.21 总结 第4章 PHP 5高级面向对象编程和设计模式 4.1 介绍 4.2 重载性能 4.3 迭代器 4.4 设计模式 4.5 映射 4.6 总结 第5章 如何用PHP写一个Web...

    PHP官方正版中文帮助手册

     异常处理  引用的解释  预定义变量  预定义异常  预定义接口  Context options and parameters  Supported Protocols and Wrappers  安全 简介  总则  以 CGI 模式安装时  以 Apache 模块安装时  ...

Global site tag (gtag.js) - Google Analytics