すべてキャッチされない例外をキャッチしませ。データを格納するためにデータベースを使用するSessionコンポーネントは、ExceptionHandlerの直後に構築されます。exceptionHandlerのは、私は、単純なexceptionHandlerのクラスを構築してい
セッションコンポーネントは、APCが使用されている場合、正しくセッションを閉じるには、次の設定:
register_shutdown_function('session_write_close');
私はその後、私のMySQLサーバをシャットダウンし、アプリケーションを実行してテストを行いました。どのような不可解されるとすると、例外がExceptionHandler
によってキャッチされていることであるが、同時にキャッチされないままとxdebugので出力されます。
SQLSTATE[HY000] [2002] ????,??????????? at line 133 in RedBean_Driver_PDO.php. //This is generated by my exception handler
//These were uncaught and processed by Xdebug
Fatal error: Uncaught exception 'Exception' with message 'PDO::__construct() [133
(!) Exception: PDO::__construct() [pdo.--construct]: [2002] ????,??????????? (trying to connect via tcp://localhost:3306) in RedBean_Driver_PDO.php on line 133
Call Stack
//Call stack
これを引き起こしている可能性がありますか?私の理解では、ExceptionHandler
は、ExceptionHandler
内にスローされた例外を除いて、すべての未捕捉例外を捕捉できるはずです。
更新: シャットダウン時に呼び出されるsession_write_close
を処理しなければならないと感じました。 session_write_closeはデータベースへのアクセスが必要ですが、データベースは使用できません。例外がスローされます。スクリプトの実行が終了したので、ExceptionHandler
は使用できません。したがって、キャッチされない例外が発生します。とにかくこの周りにはありますか?
Windows 7マシンでmod_cgiを使用してapache 2.2でfcgiとして5.3.9を実行しています。
スタックトレース:
# Time Memory Function
1 2.0323 767336 ExceptionHandler->handleException() //Initial exception caught + handled
2 2.0334 773968 Session->write() //Script shutdown started (session_write_close to database)
3 2.0335 774344 Database->findOne()
4 2.0335 774640 Database->__call()
5 2.0335 774728 call_user_func_array()
6 2.0335 775016 RedBean_Facade::findOne()
7 2.0335 775016 RedBean_Facade::find()
8 2.0335 775384 RedBean_OODB->find()
9 2.0335 775384 RedBean_QueryWriter_AQueryWriter->selectRecord()
10 2.0335 775448 RedBean_QueryWriter_AQueryWriter->safeTable()
11 2.0335 775536 RedBean_QueryWriter_AQueryWriter->check()
12 2.0335 775536 RedBean_Adapter_DBAdapter->escape()
13 2.0335 775536 RedBean_Driver_PDO->Escape()
14 2.0335 775536 RedBean_Driver_PDO->connect()
15 2.0336 776200 PDO->__construct() //Cannot connect to database
16 4.0433 782768 ErrorHandler->handleError() //Error converted to exception
私はこれは本当に避けられないという気持ちを持って、そして本番環境display_errors
で、とにかくオフになります。しかし、私はこのソリューションには満足していません。非常に「きれい」ではないようです。
これはあなたの問題を解決しないかもしれないが、あなたはこのコードを修正してみてください可能性が立ち往生していると思う '$ exception->はgetFile()); '$ exception-> getFile());' – rdlowrey
try/catchの中に問題のコードをラップし、PDO例外がスローされたときに現在の例外ハンドラが何であるかを確認します。多分、他のコンポーネントがあなたの背中の例外ハンドラをリセットしたでしょうか? – Jon
@rdlowrey:それを修正しましたが、それは私が質問を書いていたときの誤植でした。 @ジョン:試して/キャッチし、例外を沈黙させることができたコードをラップしようとしました。例外ハンドラをチェックしましたが、それはまだ使用されていた 'ExceptionHandler'でした。私は明示的に 'exit()'を 'handleException()'に追加しましたが、未知の例外が 'exit()'の後に出力されているようです! – F21