28:PHP异常处理与Errors错误处理

一、扩展(extend) PHP 内置的异常处理类

用户可以用自定义的异常处理类来扩展 PHP 内置的异常处理类。以下的代码说明了在内置的异常处理类中,哪些属性和方法在子类中是可访问和可继承的。译者注:以下这段代码只为说明内置异常处理类的结构,它并不是一段有实际意义的可用代码。

  1. <?php
  2.  class  Exception
  3.  {
  4.     protected  $message  =  'Unknown exception' ;    // 异常信息
  5.      private    $string ;                           // __toString cache
  6.      protected  $code  =  0 ;                         // 用户自定义异常代码
  7.      protected  $file ;                             // 发生异常的文件名
  8.      protected  $line ;                             // 发生异常的代码行号
  9.      private    $trace ;                            // backtrace
  10.      private    $previous ;                         // previous exception if nested exception
  11.      public function  __construct ( $message  =  null ,  $code  =  0 ,  Exception $previous  =  null );
  12.     final private function  __clone ();            // Inhibits cloning of exceptions.
  13.      final public  function  getMessage ();         // 返回异常信息
  14.      final public  function  getCode ();            // 返回异常代码
  15.      final public  function  getFile ();            // 返回发生异常的文件名
  16.      final public  function  getLine ();            // 返回发生异常的代码行号
  17.      final public  function  getTrace ();           // backtrace() 数组
  18.      final public  function  getPrevious ();        // 之前的 exception
  19.      final public  function  getTraceAsString ();   // 已格成化成字符串的 getTrace() 信息
  20.     // Overrideable
  21.      public function  __toString ();                // 可输出的字符串
  22.  }
  23.  ?>

如果使用自定义的类来扩展内置异常处理类,并且要重新定义构造函数的话,建议同时调用 parent::__construct()来检查所有的变量是否已被赋值。当对象要输出字符串的时候,可以重载 __toString() 并自定义输出的样式。

 

Note:

Exception 对象不能被复制。尝试对 Exception 对象复制 会导致一个 E_ERROR 级别的错误。

 

PHP异常处理几个注意知识点:

Try - 使用异常的函数应该位于 "try" 代码块内。如果没有触发异常,则代码将照常继续执行。但是如果异常被触发,会抛出一个异常。

Throw - 这里规定如何触发异常。每一个 "throw" 必须对应至少一个 "catch"

Catch - "catch" 代码块会捕获异常,并创建一个包含异常信息的对象

  1. <?php
  2.  function  inverse ( $x ) {
  3.     if (! $x ) {
  4.         throw new  Exception ( 'Division by zero.' );
  5.     }
  6.     return  1 / $x ;
  7. }
  8. try {
  9.     echo  inverse ( 5 ) .  "\n" ;
  10.     echo  inverse ( 0 ) .  "\n" ;
  11. } catch ( Exception $e ) {
  12.     echo  'Caught exception: ' ,   $e -> getMessage (),  "\n" ;
  13. }
  14. // Continue execution
  15.  echo  "Hello World\n" ;
  16.  ?>
  17. /**
  18. 以上例程会输出:
  19.  0.2
  20. Caught exception: Division by zero.
  21. Hello World
  22. **/

PHP异常处理与errors错误处理

二、Errors错误处理

1、基础

PHP的错误报告中回应了一些内部错误条件。这些可以用来表示一些不同的条件,并且可以根据需要显示和/或记录.。

每一个错误,PHP生成包括类型。这些类型的列表是可用的,以及简短的描述他们的行为,以及它们是如何引起的。

 

2、PHP的错误处理

如果没有错误处理程序集,然后将处理PHP出现根据其配置的任何错误。这错误报告和被忽视的error_reporting php.ini指令控制,或在运行时通过调用error_reporting()。强烈建议设置配置指令,但是,因为一些错误可能发生之前,您的脚本开始执行。

在开发环境中,你应该总是设置error_reporting到e_all,你需要了解和解决的问题,提出用PHP。在生产中,您可能希望将这一少的详细级别如e_all和~ e_notice和~ e_strict和~ e_deprecated,但在许多情况下,e_all也是合适的,因为它可以提供潜在问题的早期预警

PHP与这些误差取决于两个进一步的指示。display_errors控制误差是否表现为部分脚本的输出。这应该总是在生产环境中禁用,因为它可以包括机密信息,如数据库密码,但往往是有用的,使开发,因为它确保立即报告的问题。

除了显示错误,PHP可以记录错误时,log_errors指令启用。这将记录任何错误的文件或日志定义的error_log。这在生产环境中非常有用,因为您可以记录发生的错误,然后根据这些错误生成报表.。

 

3、用户的错误处理程序

如果PHP的默认错误处理是不够的,你还可以处理多种类型的错误与您自己的自定义错误处理程序的安装与set_error_handler()。虽然某些错误类型不能以这种方式处理,但可以处理的那些类型可以按脚本认为合适的方式处理:例如,这可以用来向用户显示自定义错误页,然后直接通过日志来报告,例如通过发送电子邮件.。

 

4、PHP 7 错误处理

PHP 7 改变了大多数错误的报告方式。不同于 PHP 5 的传统错误报告机制,现在大多数错误 被作为 Error 异常抛出。

这种 Error 异常可以像普通异常一样被 try / catch块所捕获。如果没有匹配的 try / catch 块, 则调用异常处理函数(由 set_exception_handler() 注册)进行处理。 如果尚未注册异常处理函数,则按照传统方式处理:被报告为一个致命错误(Fatal Error)。

Error 类并不是从 Exception 类 扩展出来的,所以用 catch (Exception $e) { ... } 这样的代码是捕获不 到 Error 的。你可以用 catch (Error $e) { ... } 这样的代码,或者通过注册异常处理函数( set_exception_handler() )来捕获 Error。

 

Error 异常层次结构

1. Throwable 1. Error 1. ArithmeticError

2. AssertionError

3. DivisionByZeroError

4. ParseError

5. TypeError

 

2. Exception

1. ...

    A+
发布日期:2017年01月13日 14:20:18  所属分类:PHP教程
最后更新时间:2017-01-13 14:20:18
付杰
  • ¥ 45.0元
  • 市场价:45.0元
  • ¥ 89.0元
  • 市场价:129.0元
  • ¥ 199.0元
  • 市场价:399.0元
  • ¥ 69.0元
  • 市场价:69.0元

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

目前评论:1   其中:访客  0   博主  0

  1. 头像 蓝洛 1

    不错的。 这是我的博客网址,有空去看看吧😁
    www.zhaorui.info