1. 错误报告级别 error_reporting()

error_reporting(int $level);

PHP 5.4 及以上 E_ALL 包含了 E_STRICT。

PHP Manual 所有的错误级别。

范例:

<?php// 关闭所有PHP错误报告error_reporting(0);// Report simple running errorserror_reporting(E_ERROR | E_WARNING | E_PARSE);// 报告 E_NOTICE也挺好 (报告未初始化的变量// 或者捕获变量名的错误拼写)error_reporting(E_ERROR | E_WARNING | E_PARSE | E_NOTICE);// 除了 E_NOTICE,报告其他所有错误error_reporting(E_ALL ^ E_NOTICE);// 报告所有 PHP 错误 (参见 changelog)error_reporting(E_ALL);// 报告所有 PHP 错误error_reporting(-1);// 和 error_reporting(E_ALL); 一样ini_set('error_reporting', E_ALL);?>

2. 错误处理函数 set_error_handler()

set_error_handler(function (int $errno, string $errstr, string $errfile, int $errline) {    // ...}, $error_types = E_ALL)

上述 $error_types 指定的错误类型会被该错误处理函数拦截 ( 除非该函数返回了 false)

带 @ 前缀的语句发生错误时, $errno 值为 0

脚本会在该处理函数结束后继续执行 (因此必要时需主动调用 die() )

范例:

function handleError($level, $message, $file = '', $line = 0){    if (error_reporting() & $level) {        throw new ErrorException($message, 0, $level, $file, $line);    }    return false;}

将 错误 转换为 异常

注意: 无法捕获的错误

以下级别的错误不能由用户定义的函数来处理:

E_ERROR

E_PARSE

E_CORE_ERROR

E_CORE_WARNING

E_COMPILE_ERROR

E_COMPILE_WARNING

在 调用 set_error_handler() 函数所在文件中产生的大多数 E_STRICT。

这些无法捕获的错误, 可在 register_shutdown_function() 中处理( 但脚本仍会结束 )

3. 异常处理函数 set_exception_handler

// < PHP 7set_exception_handler('handleException')// < PHP 7handleException(Exception $ex){    echo "Uncaught exception: " , $ex->getMessage(), "\n";}// >= PHP 7handleException(Throwable $ex){    echo "Uncaught exception: " , $ex->getMessage(), "\n";}

在用户自定义异常处理函数内部, 可根据情况做一下处理:

日志记录错误

web 渲染错误页面

console 渲染错误提示

4. PHP 中止时执行函数

register_shutdown_function

register_shutdown_function(function () {}, $para1, $param2, ...)

在用户自定义脚本中止处理函数内部, 可根据情况做一下处理:

判断是否因严重错误而结束脚本(无法被 set_error_handler 捕获的错误中止脚本)

register_shutdown_function('handleShutdown')function handleShutdown(){if (! is_null($error = error_get_last()) && isFatal($error['type'])) {      // handleException() 函数同时处理 set_exception_handler      handleException(new \ErrorException(        $error['message'], $error['type'], 0, $error['file'], $error['line'],      ));  }}function isFatal($type){  return in_array($type, [E_COMPILE_ERROR, E_CORE_ERROR, E_ERROR, E_PARSE]);}

以下错误无法被 set_error_handler 捕获

E_ERROR

E_PARSE

E_CORE_ERROR

E_CORE_WARNING

E_COMPILE_ERROR

E_COMPILE_WARNING

若因为错误而结束脚本, 若是严重错误则可将其转为 异常类, 并由异常处理函数统一处理.

Note:

多次调用 register_shutdown_function 时不会互相覆盖, 而是会按照注册顺序被依次调用.

除非在某个注册的方法内部调用 exit()

Note:

进程被信号 SIGTERMSIGKILL 杀死时中止函数不会被调用. 可通过 pcntl_signal 捕获信号, 再在其中调用 exit() 来进行正常中止。

更多相关问题请访问PHP中文网:PHP视频教程


更多相关文章

  1. php函数原理
  2. php中if函数用法
  3. php构造函数的作用
  4. php usort()函数的使用方法
  5. php中获取当前时间的函数
  6. PHP魔术常量、魔术函数、预定义常量详细介绍及实例讲解
  7. php排序函数详细讲解(附实例)
  8. php对象转数组的函数
  9. PHP 手册中的匿名函数关联用法分析

随机推荐

  1. 相关约束参数的含义
  2. Hive中的case when 的写法
  3. 一些常用到的android前端布局属性
  4. android studio 编译的时候出现的错误和
  5. Android五种常用数据的存储方式
  6. Android 四种定时器的写法
  7. AutoCompleteTextView
  8. Android(安卓)SDK 2.2安装问题
  9. Android主题和系统样式篇(下)
  10. Android隐藏状态栏和标题栏,相当于全屏效