PHP错误处理

PHP预定义了多个级别的错误代码,PHP在执行时遇到了错误会产生这些错误代码以及错误描述,用户可以选择展示或者记录到日志中去。

  • E_ERROR 致命的运行时错误,会导致脚本终止;
  • E_WARNING 非致命错误,给出提示信息,但不会导致脚本终止;
  • E_PARSE 语法解析错误,导致无法运行脚本;
  • E_NOTICE 运行时通知,遇到了可能为错误的情况,可以正常运行代码;
  • E_CORE_ERROR、E_CORE_WARNING 、E_COMPILE_ERROR、E_COMPILE_WARNING均为由引擎产生的错误;
  • E_USER_ERROR、E_USER_WARNING、E_USER_NOTICE E_USER_DEPRECATED是用户使用PHP函数 trigger_error() 产生的。
  • E_STRICT 启用PHP对代码的修改建议,以确保兼容性。
  • E_RECOVERABLE_ERROR 可以被捕捉的致命错误,如果不用set_error_handler()捕捉,将导致脚本终止运行;
  • E_DEPRECATED 对将来版本无法正常工作的代码给出警告;
  • E_ALL 是最低的错误级别;

以上错误级别需要用位运算组合来启用或屏蔽某些类型的错误。如:error_reporting(E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED)。调用error_log()来写入错误日志。

PHP7改变了传统的错误报告机制,现在大多数错误通过Error异常抛出,可以用 catch(Error $e) { …} 来捕捉,或者通过注册set_error_handler()来捕捉Error,如果没有注册异常处理函数,则按传统方式报告为一个致命错误。可以用ErrorException来转换传统错误。

PHP使用try catch finally主流做法来捕获异常,抛出的异常必须是Exception或其子类,否则就是致命错误。如果catch子句无法捕获异常,就会被PHP报告为致命错误,除非set_exception_handler()取捕获,否则将导致脚本终止。PHP5.5开始支持finally子句。

自定义异常参见如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
class MyException extends Exception
{
    // 重定义构造器使 message 变为必须被指定的属性
    public function __construct($message, $code = 0, Exception $previous = null) {
        parent::__construct($message, $code, $previous);
    }
    // 自定义字符串输出的样式
    public function __toString() {
        return __CLASS__ . ": [{$this->code}]: {$this->message}\n";
    }
}

标准异常包含了如下属性:getMessage(), getPrevious(),getCode(),getFile(),getLine(),getTrace(),getTraceAsString()