質問: 特に言語に指定があるわけではありませんが, `try-catch`でエラーが発生した際、エラーをログとして保存したいとします(下コードの`WriteExceptionToLogFile`部)。 ``` try { // 例外が発生するソース } catch(Exception exception) { // エラーをログファイルに書き込み WriteExceptionToLogFile(exception); // エラーを表示 DisplayErrorMessageBox("エラーが発生しました!"); } ``` 今までは上コードのようにしてましたが、もし`WriteExceptionToLogFile`がエラーを発生させるなどした際の考慮をすると問題が二つあることに気づきました。 * `WriteExceptionToLogFile`がエラーを発生させると、そこでプログラムが止まる * `WriteExceptionToLogFile`自身のエラーを知ることができないうえに`WriteExceptionToLogFile`により書き込まれるはずだった例外もわからなくなる `catch`節で実行中のロガーがエラーで停止した際の対処方法として、上ふたつの問題を解決できる方法はありますか?それとも、そもそもロガーがエラーを発生しないことを暗黙の了解にしてしまうのでしょうか?
回答: > > `WriteExceptionToLogFile`がエラーを発生させると、そこでプログラムが止まる > > > 「エラー」と言っているのは「例外(Exception)」のことだと思いますが、`WriteExceptionToLogFile`内で例外がスローされる可能性があるようでしたら、それをcatchして、処理を継続すればプログラムは停止しません。 > > `WriteExceptionToLogFile`自身のエラーを知ることができないうえに`WriteExceptionToLogFile`により書き込まれるはずだった例外もわからなくなる > > > `WriteExceptionToLogFile`内でスローされた例外をcatchして、その例外ともともとの例外を別のファイルなどに出力すればいいです。ただし、ログファイルへの書き込みに失敗するとすれば、ディスク容量不足のような超例外ケースなので、標準(エラー)出力などログファイル以外に出力した方がいいと思います。 ``` try { // 例外が発生するソース } catch(Exception exception) { // エラーをログファイルに書き込み WriteExceptionToLogFile(exception); // エラーを表示 DisplayErrorMessageBox("エラーが発生しました!"); } } private void WriteExceptionToLogFile(Exception exception) { try { // エラーをログファイルに書き込み } catch (Exception e) { // 標準エラーストリームに出力 e.printStackTrace(); System.err.println("もともとの例外:"); exception.printStackTrace(); } } ```