• 締切済み

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 ■疑問 なぜキャッチしてくれないか? どう対処してよいか分かりません。 どなたか教えてください。

みんなの回答

  • proust
  • ベストアンサー率57% (62/108)
回答No.1

Logger#info()メソッドはIOExceptionをthrowしません。 ですので呼び側から直接catchすることは不可能です。 log4jの中でcatchしてErrorHandlerというものに処理を委譲 したあと、呼び元には例外を出さずに戻っているようです。 これは恐らく、ログ出力をする箇所全てにいちいちIOExceptionを 処理するコードを書かせたくないからだと思います。 (ちなみに、RuntimeExceptionとその子孫以外のExceptionを throwするメソッドがある場合、そのメソッドを呼ぶメソッドは そのExceptionをさらに上位へthrowするか、またはcatchしないと コンパイルエラーになります。aaa()のthrows IOExceptionをとっても エラーにならないでしょう。) で対策ですが、ErrorHandlerインタフェースの実装を自作して、 設定ファイルのerrorHandlerエレメントに登録して使えばいいようです。 ただ、私は使ったことがなく、また、よほどカッチリしたシステムでないと あんまりこれを積極的に使っているケースは見たことがありません。 ログが出ないような状況では、エラーハンドリングするにしても 対策のしようがないからなのでしょう。

参考URL:
http://www.jajakarta.org/kvasir/bbs/technical/32?msg=2#msg93
kenman
質問者

お礼

さっそくの回答ありがとうございます。 Log4J#errorメソッドや#fatalメソッドも Javadocを見ますとIOExceptionをthrowしない ようなので#infoメソッドと同様の扱い (例外をキャッチすることは不可能) ということになるんですね。 ErrorHandlerインタフェースについては どういったものなのかよく理解できていないので 調べてみようと思っています。

関連するQ&A