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

时间:2012-09-11 22:07:33

标签: php

我想找出当前的错误处理程序,以及处理错误。

我知道set_error_handler()会返回上一个错误处理程序,但有没有办法在不设置新错误处理程序的情况下找出当前错误处理程序的内容?

6 个答案:

答案 0 :(得分:15)

尽管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

看,马,它是幂等的!

答案 1 :(得分:8)

是的,有一种方法可以在不设置新错误的情况下找出错误处理程序。这不是一步本机php功能。但它的效果正是你所需要的。

总结了@aurbano的所有建议,@ AL X,@ Jesse和@​​ Dominic108的替换方法可能看起来像这样

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

答案 2 :(得分:6)

您可以使用set_error_handler()set_error_handler()返回当前错误处理程序(尽管为'mixed')。检索完毕后,请使用restore_error_handler(),这样就可以保留原样。

答案 3 :(得分:5)

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

答案 4 :(得分:0)

<?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

答案 5 :(得分:-4)

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