操作环境:php7.4.33
使用 set_exception_handler() 来定义,默认的异常处理程序,通常用在 没有 try/catch 块 捕获的异常。
自动捕获
首先,定义一个处理异常的函数。
function myExceptionHandler($exception)
{
echo $exception->getMessage();
}
然后调用函数 set_exception_handler(),他的值是定义的函数名。
set_exception_handler('myExceptionHandler');
然后,当代码中发生了一些类型的错误,将被它自动捕获。
假如,我们调用一个 没有定义 的函数 abc():
abc();
在没有使用 自定义 异常处理函数前,将得到一长段 异常信息:
Fatal error: Uncaught Error: Call to undefined function abc() in D:\xapp\www\htdocs\00.mysql.php:15 Stack trace: #0 {main} thrown in D:\xapp\www\htdocs\00.mysql.php on line 15
在使用了 自定义 异常处理函数 后,我们将得到一段简单的 异常信息:
Call to undefined function abc()
简单明了!
需要说明:set_exception_handler() 此种方法能处理的类型为 致命级别(Fatal error) 的错误。
其他类型如:E_ERROR、 E_PARSE、 E_CORE_ERROR、 E_CORE_WARNING、 E_COMPILE_ERROR、
E_COMPILE_WARNING,和在 调用 set_error_handler() 函数所在文件中产生的大多数 E_STRICT
不能处理,他们将独立于用户自定义错误处理函数之外,独立显示出来。
手动抛出
除了能够自动捕获系统级别的异常,还可以捕获手动抛出的异常信息:
使用 throw 关键字 new Exception :
throw new Exception('error message ');
最后,捕获的就是 括号里的字符串 error message
在没有 try/catch 块的情况下,throw 抛出的异常信息,将被 自定义的 异常处理所捕获,有try/catch 快的情况下,将优先通过 try/catch 爆出!
try {
throw new Exception('Test String!');
} catch (Exception $e) {
print_r('Error Messages: '.$e->getMessage());
}
最后输出:
Error Messages:Test String
PHP 7 错误处理
不同于传统PHP5的错误报告机制,PHP7中,大多数错误被当做 Error 异常抛出。
Error 可以像 Exception 一样被 try/catch 块 捕获。
需要注意的是 Error 不是 继承自 Exception ,所以不能用 catch (Exception $e) { ... } 来捕获 Error,而是用 catch (Error $e) { ... },或者通过注册异常处理函数( set_exception_handler())来捕获 Error。
因为 Exception 和 Error 都是继承自 Throwable 接口 ,所以也可以像下面一样使用:
try {
Throw new Error('Test String!');
} catch (Throwable $th) {
echo 'Error Message: '. $th->getMessage();
}
catch块的括号里写 catch (Throwable $e) ,也是能发挥作用的!