4

ページ内のすべての PHP エラー (E_ERROR、E_WARNING、E_NOTICE、..) をキャッチし、それを MongoDB に記録して、より適切に読んでコメントしたいと考えています。

「error_get_last」で最後に発生したエラーをキャッチし、「register_shutdown_function」で必要な場所に送信する方法を見つけましたregister_shutdown_function() を使用して PHP で致命的なエラーを処理します

しかし、ファイルに複数のエラー (警告や通知など) がある場合、ファイル内のすべてのエラーを取得するにはどうすればよいでしょうか? これは可能ですか?私が必要とするのは、「error_get_all」のようなものです。

ここに私のコードがあります。このコードには致命的なエラーが 1 つ、警告が 2 つ、通知が 1 つあります。

function shutdown() {
  $error = error_get_last();
  if ($error['type'] === E_ERROR || $error['type'] === E_WARNING || $error['type'] === E_NOTICE) {
    var_dump($error);
  }
}

register_shutdown_function('shutdown');

spl_autoload_register('foo');

$x = 5;
$y = 0;

echo 'x/y: ' . $x / $y . '<br/>';

foreach ($noarray as $noelement) {
  echo 'no element: ' . $noelement . '<br/>';
}
4

5 に答える 5

4

答えは、ソリューションを組み合わせることです。

「set_error_handler」を使用して、考えられるすべてのエラーをキャッチし ( http://php.net/manual/en/function.set-error-handler.phpを参照)、説明されている register_shutdown_function を使用して、見逃されたエラーをログに記録します。これで。

これにより、ランタイム中の致命的ではないエラーがカスタム ハンドラーによってキャッチされ、スクリプトの最後まで継続するか、タイプに応じてカスタムまたはシャットダウン関数によってキャッチされる致命的なエラーが発生します。

于 2012-07-09T14:00:13.900 に答える
3

set_error_handlerを使用します。

次のエラー タイプは、ユーザー定義関数では処理できません: E_ERROR、E_PARSE、E_CORE_ERROR、E_CORE_WARNING、E_COMPILE_ERROR、E_COMPILE_WARNING、および set_error_handler() が呼び出されるファイルで発生するほとんどの E_STRICT。

于 2012-07-09T13:53:55.963 に答える
1

致命的なエラーをキャッチし、エラーを解析するために、正しい関数を使用しています

register_shutdown_function

ただし、アプリケーションが致命的なエラー、解析エラー、または何らかのエラー E_ERROR に達すると、スクリプトのその時点で実行プロセスが終了するため、この場合、スクリプトでそのようなエラーを 1 つだけキャッチできます。

システム内のすべてのエラーを簡単に追跡して検証できるようにすることregister_shutdown_functionで、致命的なエラーをキャッチし、set_error_handler他のエラーを警告などとしてキャッチする関数を使用して他のエラーをキャッチすることをお勧めします。set_exception_handler

エラー処理用のオブジェクトを作成する場合、ロジックは次のようになります。

$handler = new Handler();
$handler->handleExceptions(); //using set_exception_handler exceptions
$handler->handleError(E_ALL); //using set_error_handler all other errors
$handler->handleShutdown(); //using register_shutdown_function fatals, parsing

これにより、エラーのオン/オフを切り替えたり、必要な場所にエラーを保存したり、1 か所から電子メールで送信したりできるオプションが得られます。また、デバッグ用に完全なエラーを取得する簡単な方法もあります。

于 2016-07-15T12:53:02.717 に答える
0

次のようなフレームワークを使用したいかもしれません: http://code.google.com/p/lagger/

于 2012-07-09T13:56:14.430 に答える
-1

Fatal errors past the first one encountered are impossible to catch, as the PHP interpreter never reaches them (the script terminates after it executes your shutdown handler). Non-fatal errors can be caught (you will need a separate error_handler installed for them in addition to your shutdown handler), PHP won't terminate the script so if you don't terminate it in your error handler either, execution will continue after each non-fatal error and you will catch them all. If you want to still terminate afterファイル全体が実行された場合、どこかにフラグを保持し、ファイルを含める前にフラグをクリアして、エラーが発生した場合に発生させることができます。ファイルがインクルードされた後、このフラグをテストして、エラーが検出されたかどうかを確認できます。インクルードされたファイルはその時点で完全に実行されているか (致命的なエラーがない場合)、その時点に到達しない可能性があることに注意してください (致命的なエラーがある場合)。

信頼されていないユーザー コードを実行している場合は、Runkit Sandboxに興味があるかもしれません。インクルード前の検証については、 runkit_lint_file()を参照することもできます。

于 2012-07-09T14:02:28.800 に答える