22

我想知道当前是什么错误处理程序,嗯,处理错误。

我知道这set_error_handler()将返回以前的错误处理程序,但是有没有办法在不设置新错误处理程序的情况下找出当前的错误处理程序?

4

7 回答 7

25

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

看,妈,它是幂等的!

于 2014-08-06T20:32:43.257 回答
13

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

总结@aurbano、@AL the X、@Jesse 和@Dominic108 替换方法的所有建议可以是这样的

function get_error_handler(){
    $handler = set_error_handler(function(){});
    restore_error_handler();
    return $handler;
}
于 2017-04-11T09:40:52.310 回答
6

你可以使用set_error_handler(). set_error_handler()返回当前的错误处理程序(尽管是“混合的”)。取回它后,使用restore_error_handler(),它将保持原样。

于 2012-09-11T22:11:11.733 回答
6

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

于 2012-09-11T22:11:56.087 回答
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

于 2015-12-09T14:46:36.420 回答
0

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

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

如果您想要 - 例如在单元测试中 - 注册了哪个异常处理程序,这可能很有用。

于 2021-09-19T10:33:55.993 回答
-4

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

于 2012-09-11T22:20:31.463 回答