如何检索当前错误处理程序


How can I retrieve the current error handler?

我想知道目前处理错误的错误处理程序是什么。

我知道set_error_handler()会返回以前的错误处理程序,但有没有一种方法可以在不设置新错误处理程序的情况下找出当前错误处理程序?

尽管PHP中缺少get_error_handler()函数,但您可以对set_error_handler()使用一些技巧来检索当前的错误处理程序,尽管根据其值,您可能无法对这些信息做太多处理。尽管如此:

set_error_handler($handler = set_error_handler('var_dump'));
// Set the handler back to itself immediately after capturing it.
var_dump($handler); // NULL | string | array(2) | Closure

看,妈,它是幂等的!

是的,有一种方法可以在不设置新的错误处理程序的情况下找到错误处理程序。这不是一步到位的原生php函数。但它的效果正是你所需要的。

总结@aurbano、@AL the X、@Jesse和@Dominic108的所有建议,替换方法可以看起来像这个

function get_error_handler(){
    $handler = set_error_handler(function(){});
    restore_error_handler();
    return $handler;
}

您可以使用set_error_handler()set_error_handler()返回当前错误处理程序(尽管为"混合")。检索到它之后,使用restore_error_handler(),它将保持原样。

这在PHP中是不可能的-正如您所说,当您调用set_error_handler并使用restore_error_hardler 还原它时,您可以检索当前错误处理程序

<?php
class MyException extends Exception {}
set_exception_handler(function(Exception $e){
    echo "Old handler:".$e->getMessage();
});
$lastHandler = set_exception_handler(function(Exception $e) use (&$lastHandler) {
    if ($e instanceof MyException) {
        echo "New handler:".$e->getMessage();
        return;
    }
    if (is_callable($lastHandler)) {
        return call_user_func_array($lastHandler, [$e]);
    }
    throw $e;
});

触发异常处理程序:

throw new MyException("Exception one", 1);

输出:New handler:Exception one

throw new Exception("Exception two", 1);

输出:Old handler:Exception two

也可以使用https://stackoverflow.com/a/43342227用于获取最后一个异常处理程序:

function get_exception_handler()
{
    $handler = set_exception_handler(function () {});
    restore_exception_handler();
    return $handler;
}

如果您希望(例如在单元测试中)哪个异常处理程序已经注册,这可能会很有用。

我检查了来源,答案是否定的。