![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
■行いたこと
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件)
- 最新から表示
- 回答順に表示
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 …
さっそくの回答ありがとうございます。
Log4J#errorメソッドや#fatalメソッドも
Javadocを見ますとIOExceptionをthrowしない
ようなので#infoメソッドと同様の扱い
(例外をキャッチすることは不可能)
ということになるんですね。
ErrorHandlerインタフェースについては
どういったものなのかよく理解できていないので
調べてみようと思っています。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java java 飾子を付けること(public static・・・) ・コンソールへの出力処理はmainメ 2 2022/06/16 19:34
- Java java 次の機能を有するメソッドを自クラスに作成し、実装したいです。 機能 名前判定機能 →名前が 3 2022/06/16 16:08
- Java javaの質問です 次の機能を有するメソッド4つを自クラスに作成し、実装したいです 【機能】 足し算 1 2022/06/15 17:49
- Java javaの質問です 次の機能を有するメソッド4つを自クラスに作成し、実装したいです 【機能】 足し算 1 2022/06/15 15:14
- UNIX・Linux Linuxについて質問です。 以下のhistoryの出力結果から、sedコマンドのファイル名tmp1 1 2023/02/03 20:11
- Excel(エクセル) ¥マークを含むパスの処理について(マクロ、または関数) 2 2022/12/25 02:11
- その他(プログラミング・Web制作) どういうプログラムで組みますか?google colabでやってるんですけど、出来る方お願いします。 1 2022/07/17 18:41
- JavaScript 指定したパスが現URLに含まれていたら特定要素を削除するJavascriptのコードを教えてください 2 2023/04/27 17:58
- その他(プログラミング・Web制作) bashのgrepで複数の検索、かつスクリプト内で改行する方法を教えてください。 1 2022/10/06 20:09
- Excel(エクセル) Excel VBA 3 2023/04/22 10:46
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Java初級 引数に適用できません
-
レコード件数の表示
-
Strutsでチェックボックスの値...
-
リストボックスの並べ替え (VB...
-
多角形同士の交差の判定
-
abstract と static を一緒に付...
-
『クラス』と『メソッド』とは...
-
下記のリストならno002が含まれ...
-
Singly linked listで最後から...
-
mainクラス内に書いたメソッド...
-
メソッドの引数に指定されてい...
-
JUnitでのプライベートメソッド...
-
匿名クラス内のメソッドをオー...
-
Javaの公式メソッドの中身を見...
-
JavaからCへ
-
別クラスのmainメソッドの実行
-
StringBufferからStringへキャ...
-
privateのメソッドをリフレクシ...
-
YYYYMMDD書式の日付に対する適...
-
クラス変数とクラスメソッドを...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
レコード件数の表示
-
Java初級 引数に適用できません
-
String.containsの反対機能はあ...
-
public static void main (Stri...
-
abstract と static を一緒に付...
-
Google Apps Script で getRang...
-
StringBufferからStringへキャ...
-
メソッド宣言の戻り値の型にク...
-
javaに"search"という関数 or ...
-
C# 点の描き方をおしえてくだ...
-
Java初心者です、エラーの意味...
-
なぜprotected overrideなのか
-
親の親のメソッドを呼ぶには?
-
C# でメソッドに送られてきたOb...
-
Javaの関数名が長い?
-
別クラスのmainメソッドの実行
-
[クラス名].[メソッド名].[メソ...
-
コマンドライン引数のチェック
-
contextってなんですか?
-
説明文書でのメソッド・変数の...
おすすめ情報