我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...

在前几篇文章里面,苏南大叔通过各种例子验证了set_error_handler()能处理trigger_error()的错误信息,而也验证了其不可以处理throw Error()throw Exception()的信息。那么,在本文中,苏南大叔将继续以全新的php8的测试环境,验证set_exception_handler()是否能够处理相关信息呢?

苏南大叔:php教程,如何通过set_exception_handler()捕获异常信息? - set_exception_handler捕获异常
php教程,如何通过set_exception_handler()捕获异常信息?(图4-1)

苏南大叔的“程序如此灵动”博客,记录苏南大叔的编程经验文章。本文测试环境:win10nginx@1.15.11php@8.2.10-nts

前文回顾

php5php7环境下,苏南大叔写过如下文章:

所以,本文又是个新瓶装老酒,还是那熟悉的味道。新的测试环境是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()所不一样的是:throwerror或者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);
}

苏南大叔:php教程,如何通过set_exception_handler()捕获异常信息? - trycatch
php教程,如何通过set_exception_handler()捕获异常信息?(图4-2)

@抑制异常

使用@操作,抑制相关异常失败!

function test_error(){
    throw new Error('错误error',123);
}
@test_error();
echo "next";

苏南大叔:php教程,如何通过set_exception_handler()捕获异常信息? - @无法处理
php教程,如何通过set_exception_handler()捕获异常信息?(图4-3)

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);

苏南大叔:php教程,如何通过set_exception_handler()捕获异常信息? - 对exception进行进一步解析
php教程,如何通过set_exception_handler()捕获异常信息?(图4-4)

这里需要注意的是:

  • set_exception_handler()callback的参数,只有一个类实例$exception,各种数据都需要进一步解析出来。
  • set_exception_handler()callback的返回值,没有return!必然会终止执行!

表格总结

所以,set_error_handler()对比set_exception_handler()的话:

名称参数1参数2
set_error_handler()callbackerror_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经验总结,可以点击下面的链接:

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。

 【福利】 腾讯云最新爆款活动!1核2G云服务器首年50元!

 【源码】本文代码片段及相关软件,请点此获取更多信息

 【绝密】秘籍文章入口,仅传授于有缘之人   php