Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么PHP set_execption_处理程序捕获错误对象_Php_Exception_Error Handling - Fatal编程技术网

为什么PHP set_execption_处理程序捕获错误对象

为什么PHP set_execption_处理程序捕获错误对象,php,exception,error-handling,Php,Exception,Error Handling,我正在使用PHP中的错误和异常句柄,并且在尝试调用不存在的方法时发现一些意外行为 以下是PHP: 我会尽力回答我自己的问题@apokryfos是对的:手册中有这方面的详细信息。我发现set\u exception\u处理程序不仅捕获exception和Throwable对象,而且还捕获Error对象(它们是Throwable对象,但不是exception对象),这有点令人困惑 我发现这令人困惑,因为set\u error\u handler中有“error”一词,但它没有捕获这些对象类型 因此,

我正在使用PHP中的错误和异常句柄,并且在尝试调用不存在的方法时发现一些意外行为

以下是PHP:


我会尽力回答我自己的问题@apokryfos是对的:手册中有这方面的详细信息。我发现
set\u exception\u处理程序不仅捕获
exception
Throwable
对象,而且还捕获
Error
对象(它们是
Throwable
对象,但不是
exception
对象),这有点令人困惑

我发现这令人困惑,因为
set\u error\u handler
中有“error”一词,但它没有捕获这些对象类型


因此,对于其他偶然发现这一点的人来说,在较新版本的PHP中,
set\u Exception\u处理程序
回调不能使用
Exception
对象。您需要一个可丢弃的
对象,并且非线性地,您还可能得到
错误
对象,这些对象不是
设置错误处理程序所接收的对象

为了在我自己的设置中处理这个问题,我使用了以下
set\u error\u handler
来让事情变得更干净:

set\u error\u处理程序(函数($errno、$errstr、$errfile、$errline、$errcontext){
$args=array($errstr,$errno,E_ERROR,$errfile,$errline);
$errorException=new\errorException(…$args);
});

然后,您的
set\u exception\u处理程序将捕获此消息。

希望这对其他人有帮助:)

说,自PHP7以来,大多数错误都是通过抛出错误异常来报告的,处理程序也会捕获这些异常。错误和异常都实现了可丢弃的接口。你是说我只需要一个处理程序吗?如果此调用导致错误,为什么会被异常处理程序捕获?
set\u exception\u handler
是一个遗留名称。由于PHP7,它的功能比这个名字所暗示的要多。它捕获所有可丢弃的对象,包括
错误
异常
对象。如果您没有设置一个,那么您仍然可以在
set\u error\u处理程序
回调中处理这些错误,但是(我认为)这是一种传统的处理方法。请注意,在这两个处理程序中都无法捕获某些错误(例如解析错误),对于这些错误,您唯一的选择可能是
register\u shutdown\u function
,但这只能用于日志记录或清理。好的,我将返回并重新评估如何设置捕获这些错误。如果我只使用set\u exception\u处理程序,这是否令人满意?这会捕获简单的可丢弃错误吗?