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()
所捕获。代码范例如下:
也可以带上一个数字编码,形成大家所常看到报错信息:“发生了xxxxxxx错误,编码:xxx”。例如:
抛出异常Exception
同抛出Error
一样,抛出Exception
只是换了一个名称,而且名为Exception
,则必然可以被set_exception_handler()
所捕获了。
实际上,本文的主角set_exception_handler()
能捕获的错误并不仅限于上述两个throw
。很多系统错误异常,也都是能够捕获的。比如:调用一个根本不存在的函数或者初始化一个根本不存在的类。
这些时候,是隐式的抛出了一个异常。依然能够被本文的主角set_exception_handler()
捕捉到。例如:
try catch捕获
和trigger_error()
所不一样的是:throw
的error
或者exception
都可以被try catch
所捕获。
或者:

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

set_exception_handler捕获【重点】
做了这么多的铺垫,终于要引出本文的重点介绍内容:set_exception_handler()
,它可以捕获throw new Error()
和throw new Exception()
。其函数原型是:
设置默认的异常处理程序,用于没有用 try/catch 块来捕获的异常。 在 callback 调用后异常会中止。
参考文章:
set_exception_handler()
个人觉得还是用个匿名函数比较合适。例如:

这里需要注意的是:
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
经验总结,可以点击下面的链接:


