dポイントプレゼントキャンペーン実施中!

■行いたこと
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

■疑問
なぜキャッチしてくれないか?
どう対処してよいか分かりません。

どなたか教えてください。

A 回答 (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 …
    • good
    • 0
この回答へのお礼

さっそくの回答ありがとうございます。

Log4J#errorメソッドや#fatalメソッドも
Javadocを見ますとIOExceptionをthrowしない
ようなので#infoメソッドと同様の扱い
(例外をキャッチすることは不可能)
ということになるんですね。

ErrorHandlerインタフェースについては
どういったものなのかよく理解できていないので
調べてみようと思っています。

お礼日時:2005/07/31 21:26

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!