Javaでは、例外発生時の処理として,try-catch節でException#printStackTraceメソッドを使い例外内容を出力することが多いでしょう。このprintStackTraceメソッドは,メソッドの呼び出し情報をすべて表示するためやや冗長です。例外クラスから情報を取り出し,シンプルメッセージを表示する方法を紹介します。
雑誌や書籍などに掲載されているサンプルコードでは,例外発生時のcatch節でprintStackTraceメソッドを使って例外内容を出力していることが多いと思います。実用的なコードでは,例外に対して対応処理を記述し,例外内容をコンパクトなログとして残すことのほうが多いようです。
printStackTraceメソッドが出力する内容は,例外が発生した場所までのメソッド呼び出し情報を表示するため,例外によっては冗長ぎみです。たとえば,java.io.FileInputStreamクラスで間違ったファイルのパス名をパラメータとして渡した場合,次のような表示になります。
java.io.FileNotFoundException: text1.txt (指定されたファイルが見つかりません。)
at java.io.FileInputStream.open(Native Method)
at java.io.FileInputStream.<init>(FileInputStream.java:106)
at java.io.FileInputStream.<init>(FileInputStream.java:66)
at test.FileOpen.main(FileOpen.java:25)
このprintStackTraceメソッドで表示される内容は,例外クラス(この場合ならjava.io.FileNotFoundException)のオブジェクトから取得することができます。具体的には,例外メッセージである「text1.txt (指定されたファイルが見つかりません。)」は,getMessageメソッド(またはgetLocalizedMessagメソッドe)で取得します。また,「at ...」と複数行にわたって表示されているメソッド呼び出し情報は,getStackTraceメソッドで取得できます。printStackTraceメソッドと同様の処理は,次のように記述できます。
java.lang.StackTraceElement[] stack = e.getStackTrace();
System.err.println(
e.getClass().getName() + ": " + e.getMessage());
for (int i=0; i<stack.length; i++)
System.err.println("\tat " + stack[i]);
このstack[0]には例外発生場所に関する情報,stack[1]以降には各メソッドを呼び出した場所に関する情報が,最後にはユーザーのソースコードの場所が格納されます。ログとして最低限の情報を出力するなら,次のように記述することもできます。
java.lang.StackTraceElement[] stack = e.getStackTrace();
System.err.println(
e.getClass().getName() + ": " + e.getMessage());
System.err.println("\tat " + stack[stack.length-1]);
例外を発生させてみると,
java.io.FileNotFoundException: text1.txt (指定されたファイルが見つかりません。)
at test.FileOpen.main(FileOpen.java:25)
と表示されます。
さて,例外クラスのスーパークラスであるjava.lang.Throwableクラスは,J2SE 1.4からgetCauseメソッドが追加されています。このメソッドは,例外の発生原因を取得するためのものです。自ら例外クラスを定義する場合は,getCauseメソッドもきちんと定義するとよいでしょう。
「JAVA Developer」より毎週役立つJava Tipsを配信中。ほかにも参考になるTipsは、JAVA Developerサイトのバックナンバーから探すことが可能です。
Copyright(C) 2010 SOFTBANK Creative Inc. All Right Reserved.