2012-01-09 7 views
3

すべてキャッチされない例外をキャッチしませ。データを格納するためにデータベースを使用する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で、とにかくオフになります。しかし、私はこのソリューションには満足していません。非常に「きれい」ではないようです。

+0

これはあなたの問題を解決しないかもしれないが、あなたはこのコードを修正してみてください可能性が立ち往生していると思う '$ exception->はgetFile()); '$ exception-> getFile());' – rdlowrey

+0

try/catchの中に問題のコードをラップし、PDO例外がスローされたときに現在の例外ハンドラが何であるかを確認します。多分、他のコンポーネントがあなたの背中の例外ハンドラをリセットしたでしょうか? – Jon

+0

@rdlowrey:それを修正しましたが、それは私が質問を書いていたときの誤植でした。 @ジョン:試して/キャッチし、例外を沈黙させることができたコードをラップしようとしました。例外ハンドラをチェックしましたが、それはまだ使用されていた 'ExceptionHandler'でした。私は明示的に 'exit()'を 'handleException()'に追加しましたが、未知の例外が 'exit()'の後に出力されているようです! – F21

答えて

1

PHPで致命的な例外を検出することはできません。残念ながら!出力バッファをフラッシュするシャットダウン機能を登録してください。既にシャットダウン機能があるので、そこに何か問題が発生しています。私はこれをしようとするだろう。それ以外の

// This must be called before any code is executed 
register_shutdown_function('shutdownFunction'); 

function shutdownFunction() { 
    // process code - be careful not to throw another fatal exception 
    try { 
     call_user_func('session_write_close'); 
    } catch() {} 
    ob_clean(); 
} 

を...私はあなたが

関連する問題