为了账号安全,请及时绑定邮箱和手机立即绑定

为什么 PHP set_execption_handler 会捕获 Error 对象

为什么 PHP set_execption_handler 会捕获 Error 对象

PHP
慕标5832272 2023-09-15 21:29:44
我正在 PHP 中处理错误和异常句柄,并且在尝试调用不存在的方法时发现一些意外行为。这是 PHP:<?php    set_error_handler(function() {        echo 'error';    });    set_exception_handler(function() {        echo 'exception';        $args = func_get_args();        print_r($args);    });    $obj = new stdClass;    $obj->jdhgdfkjh();    exit(0);这是输出:exceptionArray(    [0] => Error Object        (            [message:protected] => Call to undefined method stdClass::jdhgdfkjh()            [string:Error:private] =>             [code:protected] => 0            [file:protected] => /var/www/domain.com/index.php            [line:protected] => 11            [trace:Error:private] => Array                (                )            [previous:Error:private] =>         ))我真的不在乎尝试调用不存在的方法时是否发生错误或异常。我只是对为什么使用错误对象调用异常处理程序感到困惑。如果有人以前遇到过这个问题,希望能得到一些澄清。
查看完整描述

1 回答

?
子衿沉夜

TA贡献1828条经验 获得超3个赞

我发现有点令人困惑的是,它set_exception_handler不仅捕获Exception对象Throwable,还Error捕获对象(它们是Throwable对象,但不是Exception对象)。


我觉得这很令人困惑,因为set_error_handler其中有“错误”一词,但它没有捕获这些对象类型。


因此,对于任何其他偶然发现这一点的人来说,在较新版本的 PHP 中,您不能期望Exception回调对象set_exception_handler。您需要期望 a Throwable,并且非线性地,您还可能获得未收到的Error对象。set_error_handler


为了在我自己的设置中处理这个问题,我采取了以下措施set_error_handler以使事情变得更清晰:


set_error_handler(function($errno, $errstr, $errfile, $errline, $errcontext) {

    $args = array($errstr, $errno, E_ERROR, $errfile, $errline);

    $errorException = new \ErrorException(... $args);

});

然后,这将被您的回调捕获set_exception_handler。

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


查看完整回答
反对 回复 2023-09-15
  • 1 回答
  • 0 关注
  • 53 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信