こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

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

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

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

投稿日時 - 2005-07-31 12:35:06

QNo.1550144

暇なときに回答ください

このQ&Aは役に立ちましたか?

2人が「このQ&Aが役に立った」と投票しています

回答(1)

ANo.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

投稿日時 - 2005-07-31 18:33:21

お礼

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

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

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

投稿日時 - 2005-07-31 21:26:30

あなたにオススメの質問