如何自动调用error_handler?

时间:2016-02-24 16:54:07

标签: php api rest

从我之前的问题中我理解,使用try/catch块管理每个异常不是一个好的做法,因为如果我有100个函数,我应该放置100 try/catch块。
现在我注意到了set_error_handler函数,如果我已经正确理解(从未使用过它),请允许我在文件中进行切换或者在整个脚本中生成所有错误。

因此,不是放try catch块,而是这个函数应该自动拦截错误并调用函数,对吗?
现在我已经有了一个Log类来帮助我在文件中编写堆栈跟踪。这个文件是每天所以我可以在分离的文件中看到所有系统事务。
我的Log类是SingleTon,所以在每个类中如果我想在日志文件中写一些跟踪,我只需要这样做:

Log::warning('some parameter here');

我的目标是创建一个error.php文件,其中所有错误都在Log::warning('...');中切换。
我认为此set_error_handler应该放在系统核心中。正如我所说,我从未使用它,有人可以通过一些例子来帮助我实现这个目标吗?我会很高兴的。

1 个答案:

答案 0 :(得分:1)

set_error_handler用于处理脚本中的错误而不是异常。

如果您想要从应用程序中捕获所有例外以应用相同的过程,则必须致电set_exception_handler PHPDoc。 此函数在参数中使用可调用的函数,因此必须在另一个函数中定义处理程序。

此函数与try catch块之间的主要区别在于

  

执行将在调用exception_handler之后停止。

保持现有异常处理程序可能由包含的lib引入也是一种很好的做法。 您可以创建一个类来执行此操作

class ErrorHandler
{
    private $previousExceptionHandler;

    public function registerExceptionHandler($callPrevious = true)
    {
        $prev = set_exception_handler(array($this, 'handleException'));
        if ($callPrevious && $prev) {
            $this->previousExceptionHandler = $prev;
        }
    }
    public function handleException(\Exception $e)
    {
         // DO YOUR STUFF

        if ($this->previousExceptionHandler) {
            call_user_func($this->previousExceptionHandler, $e);
        }
    }
}

并使用它

$errorHandler = new ErrorHandler();
$errorHandler->registerExceptionHandler();

有一些好的库可以做到这一点,尤其是如果你想捕获你的异常以进行日志记录。您可以尝试使用广泛使用的优秀Monolog lib及其ErrorHandler