2

我正在使用以下代码来捕获未捕获的异常和错误,

function my_exception_handler($e) {
        $dataToStore = array("error" => $e, "server" => $_SERVER, "request" => $_REQUEST, "backtrace" => debug_backtrace());

                //Store $dataToStore in a file
}

function my_error_handler($no, $str, $file, $line) {
    $e = new ErrorException($str, $no, 0, $file, $line);
    my_exception_handler($e);
}

set_error_handler('my_error_handler');
set_exception_handler('my_exception_handler');

我想知道是否有一种方法可以使此存储仅在文件中出现 FATAL ERRORS,$e 数组的严重性显然始终为 0。

4

3 回答 3

1

您需要register_shutdown_function执行此任务:

register_shutdown_function(function() {
  $err = error_get_last(); 

  if(!is_null($err)) {
     if ($err['type'] == E_ERROR || $err['type'] == E_CORE_ERROR) { // extend if you want
       // write to file..
     }
  }
}); 

// test it with
ini_set('max_execution_time', 1); 
sleep(5); 

$err['type']可以包含在此页面上定义的常量:错误处理 > 预定义常量

有关更多信息,请参阅:在 PHP 中捕获致命错误

于 2012-04-25T20:39:16.627 回答
0
function my_error_handler($no, $str, $file, $line) {
    switch($no){
        case E_CORE_ERROR:    
            $e = new ErrorException($str, $no, 0, $file, $line);
            my_exception_handler($e);
            break;
    }
}
于 2012-04-25T20:40:13.400 回答
0

根据 PHP 在set_error_handler上的文档,指定的处理程序应采用以下形式:

处理程序( int $errno , string $errstr [, string $errfile [, int $errline [, array $errcontext ]]] )

(……)

第一个参数errno包含引发的错误级别,作为一个整数。

这意味着您应该以这种方式制作错误处理程序:

<?php

function my_error_handler($errno, $errstr, $errfile, $errline, $errcontext) {
    // Only process fatal errors
    if ($errno == E_ERROR) {
        // Do your error processing
    }
}

set_error_handler('my_error_handler');

?>

使用这种方法,您可以精确控制如何处理每种错误。


如果你只想处理致命错误,你可以做的更容易:

混合set_error_handler ( 可调用 $error_handler [, int $error_types = E_ALL | E_STRICT ] )

第二个参数$error_types允许您指定应使用自定义错误处理程序处理哪些错误。您可以只传递E_ERROR常量,如下所示:

<?php

// Use your existing function

set_error_handler('my_error_handler', E_ERROR);

?>
于 2012-04-25T20:44:17.520 回答