- 締切済み
Java初心者です。例外のキャッチについて
■行いたこと log4jを使用してログ出力した際に、ファイルIOなどの例外が発生した場合を想定しその際に発生した例外(IOException)をキャッチして、ログ出力時にファイルIOに失敗したことを通知できるようにしたい。 ■問題 IOExceptionが発生しているようですが(下記メッセージ参照)なぜか自分のところ(プログラム)でキャッチできない。 クラスBBB メソッドbbb try { AAAクラス.メソッドaaa ←AAAクラスのログ出力 メソッドを実行 }catch ( IOException e ) { ログ出力に失敗 ←なぜかIOExceptionを キャッチしない。。。 } クラスAAA log = Loggerクラスのインスタンス purblic メソッドaaa throws IOException log.info("メッセージ") ←log4jのメソッドを実行 ************************************************** log4j:ERROR Failed to flush writer, java.io.IOException: 予期しないネットワークエラーが発生しました。 at java.io.FileOutputStream.writebytes(Native Method) at java.io.FileOutputStream.write(Unknown Sorce) at sun.nio.cs.StreamEncoder$CharsetSE.writeBytes(Unknown Sorce) 中略 at org.apache.log4j.Category.forcedLog(Category.java:372) at org.apache.log4j.Category.info(Category.java:372) at AAA.aaa() at BBB.bbb() ■環境は以下のとおりです。 OS:WindowsXP 開発環境:Eclipse3.0 JAVA:J2SDK 1.4.2_06 ■疑問 なぜキャッチしてくれないか? どう対処してよいか分かりません。 どなたか教えてください。
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- proust
- ベストアンサー率57% (62/108)
Logger#info()メソッドはIOExceptionをthrowしません。 ですので呼び側から直接catchすることは不可能です。 log4jの中でcatchしてErrorHandlerというものに処理を委譲 したあと、呼び元には例外を出さずに戻っているようです。 これは恐らく、ログ出力をする箇所全てにいちいちIOExceptionを 処理するコードを書かせたくないからだと思います。 (ちなみに、RuntimeExceptionとその子孫以外のExceptionを throwするメソッドがある場合、そのメソッドを呼ぶメソッドは そのExceptionをさらに上位へthrowするか、またはcatchしないと コンパイルエラーになります。aaa()のthrows IOExceptionをとっても エラーにならないでしょう。) で対策ですが、ErrorHandlerインタフェースの実装を自作して、 設定ファイルのerrorHandlerエレメントに登録して使えばいいようです。 ただ、私は使ったことがなく、また、よほどカッチリしたシステムでないと あんまりこれを積極的に使っているケースは見たことがありません。 ログが出ないような状況では、エラーハンドリングするにしても 対策のしようがないからなのでしょう。
お礼
さっそくの回答ありがとうございます。 Log4J#errorメソッドや#fatalメソッドも Javadocを見ますとIOExceptionをthrowしない ようなので#infoメソッドと同様の扱い (例外をキャッチすることは不可能) ということになるんですね。 ErrorHandlerインタフェースについては どういったものなのかよく理解できていないので 調べてみようと思っています。