1

私はネット全体を検索して、PHP(5.3)によってスローされたすべてのエラーをキャッチする方法を見つけようとしています。

ドキュメントを読んでいて、set_error_handler必要なもののように見えますが、致命的/解析エラーは発生しません。これが可能かどうかはわかりません...

これが私のソースです:https ://github.com/tarnfeld/PHP-Error-Handler これらすべてのより良い解決策を知っているなら、気軽にフォーク/コミットしてください。

よろしくお願いします!

更新しました!

以下の回答を使用して、エラーハンドラーの作成を終了しました。これにより、E_ERROR | E_PARSE | E_WARNING | E_NOTICEが処理され、致命的なスクリプトが強制終了されます。:-)

4

5 に答える 5

4

マニュアルの引用:

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

これは、致命的なものを捕まえて処理することができないことを意味します。できることは、スクリプトが終了したときに実行される追加のハンドラーを設定することregister_shutdown_functionです。

そのハンドラーで、error_get_lastそれが致命的なエラーであったかどうかを使用して確認します。ただし、これではスクリプトの実行を続行できません。スクリプトは終了しますが、クリーンアップやログ記録(通常、致命的なものはとにかくerror.logに記録されます)などを実行できます。

以下のコメントにユーザー提供の例がありますset_error_handler

register_shutdown_function('shutdownFunction');
function shutDownFunction() {
    $error = error_get_last();
    if ($error['type'] == 1) {
        //do your stuff    
    }
}

ただし、これでも特定の追加のランタイムエラーのみがキャッチされることに注意してください。

于 2010-12-14T11:46:09.173 に答える
2

あなたは目を離さないかもしれませんerror_log。Ubuntuではこれはにあります/var/log/apache2/error_log

于 2010-12-14T11:44:10.673 に答える
2

いわゆる「致命的なエラー」は、おそらくphpで最も厄介なバグです。これについて私たちができる最善のことは、このリクエストhttp://bugs.php.net/bug.php?id=28331に投票することにより、「phpグループ」にこのバグをそのように認識するように説得することです。

これが修正されない限り、シャットダウンエラーハンドラーや自動ロードなどのダーティハックを使用する運命にあります。

于 2010-12-14T12:04:31.597 に答える
0

いいえ、致命的なエラーや解析エラーをキャッチすることはできません。スクリプトがコンパイルされる前にエラーが発生するため、エラーを解析します。致命的なエラーは...致命的であるため(つまり、スクリプトはそれらに遭遇した後も実行を継続できません)

于 2010-12-14T11:40:51.637 に答える
0

致命的なエラー(解析エラーを含む)をキャッチしたい場合、最善の解決策は、php.iniファイルにerror_loggingを設定することです。

display_errors = Off
log_errors = On
ignore_repeated_errors = Off
ignore_repeated_source = Off
于 2010-12-14T11:48:11.680 に答える