从我之前的问题中我理解,使用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
应该放在系统核心中。正如我所说,我从未使用它,有人可以通过一些例子来帮助我实现这个目标吗?我会很高兴的。
答案 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
类