tetsunosukeのnotebook

tetsunosukeのメモです

printStackTraceのマネをする。

Log4Jとか使うと、例外の変数
つまり、

try {
    ...
} catch (Exception e){
    e.printStackTrace();
}

とかいう、その「e」を直接debug(e)とかしてやると、スタックトレースが取れる。これに似たようなことをやりたいなあと思って、printStackTraceナニモノ?と調べてみるとThrowableクラスのメソッドなのね。

んで、それ関連をごにょごにょして以下のようにして独自にスタックトレースを出力できるっぽいことがわかった。


public class ExceptionTest{
    public static void main(String[] args){
        try{
            System.out.println(args[1]);
        } catch (ArrayIndexOutOfBoundsException ae){
            System.out.println("== stacktrace by Throwable#printStackTrace() ==");
            ae.printStackTrace();

            System.out.println("== original stacktrace ==");
            System.out.println(ae.toString());
            StackTraceElement[] se = ae.getStackTrace();
            for(int i=0; i < se.length; i++){
                System.out.println("\t" + "at " + se[i].toString());
            }
        }
    }
}

結果

> java ExceptionTest
== stacktrace by Throwable#printStackTrace() ==
java.lang.ArrayIndexOutOfBoundsException: 1
        at ExceptionTest.main(ExceptionTest.java:5)
== original stacktrace ==
java.lang.ArrayIndexOutOfBoundsException: 1
        at ExceptionTest.main(ExceptionTest.java:5)

ついでにファイルに出力する場合(メモ)

try{
    FileWriter writer = new FileWriter("stacktrace.log",true);
    PrintWriter pw = new PrintWriter(writer);
    ae.printStackTrace(pw);
    writer.close();
} catch (Exception e){
    e.printStackTrace();
}