1

ここに記載されているのとまったく同じ問題があるため、このタイトルを選択しました: エラーハンドラーでスローされた PHP 例外は、例外ハンドラーによってキャッチされません

著者は、明らかに何か間違ったことをしているという答えを受け入れました。私のエラーと例外ハンドラーは、過去 2 年間は正常に機能していましたが、今ではまったく同じ問題に直面しています。コードの更新とサーバーの更新も行いました (Plesk 11.5 が実行されています。PHP のバージョンは同じで、5.3.2 である必要があります)。コードでエラーを確認しましたが、テストにより、これが問題ではないことが明らかになりました。

次のテストファイルを作成しました。

function errorHandler($errno, $errstr, $errfile, $errline, $errcontext) {
   throw new Exception("this was an error");
}

function exceptionHandler($e) {
   echo 'exceptionHandler';
}

set_error_handler('errorHandler');
set_exception_handler('exceptionHandler');

// test one:
throw new Exception(); // outputs "exceptionHandler"

// test two - uncomment the first test of course! 
$test->blabla();

2 番目のテストでも「exceptionHandler」が出力されるはずですが、そうではありません。出力は「致命的なエラー: 行 0 の ......./exeptiontest.php の非オブジェクトでメンバー関数 blabla() を呼び出す」です。

この問題は、現時点で私を夢中にさせます。ここに何か提案はありますか?これを引き起こすPHP設定はありますか?

4

1 に答える 1

2

更新(コメントを読んだ後)。

エラー ハンドラが実行された後、プログラム フローはエラーが発生した式に戻ります。しかし、致命的に失敗したスクリプトにプログラム フローを戻すことは信頼できません。そのため、エラー ハンドラは致命的なエラーで呼び出されません。ドキュメントには次のように記載されています。

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

回避策として (必要に応じて)、 を使用してシャットダウン関数を定義できますregister_shutdown_function()


元の回答(これはここでは問題ではないことが判明しました)

のドキュメントset_exception_handler()、特にコード例を注意深く読む必要があります。

function exception_handler($exception) {
  echo "Uncaught exception: " , $exception->getMessage(), "\n";
}

set_exception_handler('exception_handler');

throw new Exception('Uncaught Exception');
echo "Not Executed\n";

$test->blabla()あなたの場合、決して実行されないことを意味します。

例外ハンドラー関数が catch ブロックのように機能することを期待するかもしれませんが、そうではありません。確かに、例外が発生し、catch ブロックが定義されていない場合、プログラム フローはスクリプトを正常にシャットダウンする例外ハンドラーに引き継がれますが、それ以上ではありません。例外を正しい方法で処理したい場合は、try / catch


より明確にするために、例外ハンドラーはエラーハンドラーとは異なる動作をします。例外ハンドラーから戻った後、エラーハンドラーから戻ったときにプログラムフローがエラーの後の式に戻っている間、プログラムは終了します。

于 2013-10-01T23:07:01.443 に答える