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

set_error_handlerに関する PHP のドキュメントによると、指定されたハンドラは次の形式である必要があります。

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 ( callable $error_handler [, int $error_types = E_ALL | E_STRICT ] )

2 番目のパラメーター では$error_types、カスタム エラー ハンドラーで処理する必要があるエラーを指定できます。E_ERROR次のように、定数を渡すだけです。

<?php

// Use your existing function

set_error_handler('my_error_handler', E_ERROR);

?>
于 2012-04-25T20:44:17.520 に答える
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 に答える