我试过了:
set_error_handler('ReportError', E_NOTICE | E_USER_NOTICE);
set_error_handler('ErrorHandler', E_ALL & ~(E_NOTICE | E_USER_NOTICE));
但只有第二个有效。如何针对不同类型的错误使用不同的错误处理程序?
答案 0 :(得分:5)
为什么不在处理程序中有一个错误处理程序并按错误类型过滤并从那里调用不同的函数?制作GenericErrorHandler()
并在其中执行此操作:
switch($errno){
case E_USER_ERROR: UserErrorHandler(...); break;
}
答案 1 :(得分:3)
因此,要了解Westie所说的内容,重要的部分是您只能有一个错误处理程序,而set_error_handler()函数返回先前定义的错误处理程序,如果没有定义,则返回null。因此,在您的错误处理程序中,可能使用在注册时存储先前错误处理程序的类,以便在使用类方法处理错误时,也可以调用先前的错误处理程序。来自raven-php Sentry客户端的摘录:
public function registerErrorHandler($call_existing_error_handler = true, $error_types = -1)
{
$this->error_types = $error_types;
$this->old_error_handler = set_error_handler(array($this, 'handleError'), error_reporting());
$this->call_existing_error_handler = $call_existing_error_handler;
}
然后是句柄错误方法:
public function handleError($code, $message, $file = '', $line = 0, $context=array())
{
if ($this->error_types & $code & error_reporting()) {
$e = new ErrorException($message, 0, $code, $file, $line);
$this->handleException($e, true, $context);
}
if ($this->call_existing_error_handler && $this->old_error_handler) {
call_user_func($this->old_error_handler, $code, $message, $file, $line, $context);
}
}
答案 2 :(得分:1)
你可以有一个错误处理程序并处理这样的错误(好吧,这是PHP 5.3但是请原谅 - 稍作修改,它会正常工作)
set_error_handler(function($errno, $errstr, $errfile, $errline)
{
switch($errno)
{
case E_ERROR:
{
# Bla bla bla, your code here
return true;
}
}
return false;
});
如果你真的必须使用两个不同的set_error_handler,那么你可以使用函数调用来获取前面的错误处理程序。即使这样,你也会失去你正在过滤的错误。
拥有这样的控制器会更优雅。