php教程,如何通过set_exception_handler()捕获异常信息?
发布于 作者:苏南大叔 来源:程序如此灵动~在前几篇文章里面,苏南大叔通过各种例子验证了set_error_handler()
能处理trigger_error()
的错误信息,而也验证了其不可以处理throw Error()
及throw Exception()
的信息。那么,在本文中,苏南大叔将继续以全新的php8
的测试环境,验证set_exception_handler()
是否能够处理相关信息呢?
苏南大叔的“程序如此灵动”博客,记录苏南大叔的编程经验文章。本文测试环境:win10
,nginx@1.15.11
,php@8.2.10-nts
。
前文回顾
在php5
和php7
环境下,苏南大叔写过如下文章:
- https://newsn.net/say/php-set_error_handler.html
- https://newsn.net/say/php-set_error_handler-2.html
- https://newsn.net/say/php-set_exception_handler.html
- https://newsn.net/say/php-error-exception.html
所以,本文又是个新瓶装老酒,还是那熟悉的味道。新的测试环境是php8
,在新的环境下,苏南大叔更新了下面这篇文章:
本文的链接是:
trigger_error()
触发的自定义错误,是使用set_error_handler()
来捕获的。本文和它是有些互补的关系,捕获的是其它的错误及异常信息。
抛出错误Error
是的,这里抛出的是个Error
,而不是个Exception
。但是,它能被set_exception_handler()
所捕获。代码范例如下:
throw new Error('错误error');
也可以带上一个数字编码,形成大家所常看到报错信息:“发生了xxxxxxx错误,编码:xxx”。例如:
throw new Error('错误error带编码',123);
抛出异常Exception
同抛出Error
一样,抛出Exception
只是换了一个名称,而且名为Exception
,则必然可以被set_exception_handler()
所捕获了。
throw new Exception('异常Exception');
throw new Exception('异常Exception带编码',321);
实际上,本文的主角set_exception_handler()
能捕获的错误并不仅限于上述两个throw
。很多系统错误异常,也都是能够捕获的。比如:调用一个根本不存在的函数或者初始化一个根本不存在的类。
这些时候,是隐式的抛出了一个异常。依然能够被本文的主角set_exception_handler()
捕捉到。例如:
call_404(); // 不存在的函数
try catch捕获
和trigger_error()
所不一样的是:throw
的error
或者exception
都可以被try catch
所捕获。
try{
throw new Error('错误error',123);
}
catch(Error $e){
var_dump($e);
}
或者:
try{
throw new Exception('异常Exception',321);
}
catch(Exception $e){
var_dump($e);
}
@抑制异常
使用@
操作,抑制相关异常失败!
function test_error(){
throw new Error('错误error',123);
}
@test_error();
echo "next";
function test_exception(){
throw new Exception('异常Exception',321);
}
@test_exception();
echo "next";
set_exception_handler捕获【重点】
做了这么多的铺垫,终于要引出本文的重点介绍内容:set_exception_handler()
,它可以捕获throw new Error()
和throw new Exception()
。其函数原型是:
set_exception_handler(?callable $callback): ?callable
设置默认的异常处理程序,用于没有用 try/catch 块来捕获的异常。 在 callback 调用后异常会中止。
参考文章:
set_exception_handler()
个人觉得还是用个匿名函数比较合适。例如:
set_exception_handler(function($exception) {
var_dump(func_get_args());
$errno = $exception->getCode();
$errstr = $exception->getMessage();
$errfile = $exception->getFile();
$errline = $exception->getLine();
$errtrace = $exception->getTraceAsString();
echo "[{$errno}],{$errstr}";
echo "[{$errfile}],line:{$errline}";
});
// throw new Error('错误error',123);
throw new Exception('异常Exception',321);
这里需要注意的是:
set_exception_handler()
的callback
的参数,只有一个类实例$exception
,各种数据都需要进一步解析出来。set_exception_handler()
的callback
的返回值,没有return
!必然会终止执行!
表格总结
所以,set_error_handler()
对比set_exception_handler()
的话:
名称 | 参数1 | 参数2 |
---|---|---|
set_error_handler() | callback | error_level |
set_exception_handler() | callback | 无 |
handler(callback) | 参数 | 返回值 |
---|---|---|
error_handler() | $errno, $errstr, $errfile, $errline | 默认不终止,return false后交由系统处理,fatal error会被系统终止 |
exception_handler() | $exception | 无,默认必然停止 |
触发方式 | try catch | @ | handler |
---|---|---|---|
trigger_error() | 无法捕获 | fatal error 无法被抑制 | set_error_handler() |
throw new Error() | 可以捕获 | 无法被抑制 | set_exception_handler() |
throw new Exception() | 可以捕获 | 无法被抑制 | set_exception_handler() |
结束语
苏南大叔的各种php
经验总结,可以点击下面的链接:
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。