2012-03-12 29 views
0

例外クラスをOtherExceptionで拡張し、メッセージフィールドに投げるクラスとメソッドの名前を書きたい。メッセージを設定するために親コンストラクタを使用する以外の方法はありませんが、superの引数にgetStackTraceなどのメソッドを使用することはできません。回避策はありますか?それとも、なぜこれができないのか誰かが知っていますか?Java:例外メッセージのStackTrace情報を書き込む

public OtherException(final String message) { 
    super(message + getStackTrace()[0].getClassName()+" "+getStackTrace()[0].getMethodName()); 
} 

が、それはJavaで動作しません。

これは私が持っているしたい機能です。

これは動作します:

public OtherException(final String message) { 
    super(message + " class: " + Thread.currentThread().getStackTrace()[2].getClassName() + ", method: " 
      + Thread.currentThread().getStackTrace()[2].getMethodName()); 
} 

たぶん誰かがよりエレガントな何かを知っていますか?

答えて

0

例外のメッセージとして例外がスローされたメソッドの名前を知りたいと思いますか?この場合、あなたの実装では はOKですが、ちょうど私があなたの例外のデフォルトコンストラクタにそれを置くところ:

public OtherException() { 
    super(getStackTrace()[0].getClassName()+" "+getStackTrace()[0].getMethodName()); 
} 

本当に、あなたはあなたのコンストラクタでmessage引数を使用していないので、それは無用です。また、デフォルトのコンストラクタをオーバーライドすると、メッセージを受け入れてsuperに渡す他のコンストラクタを実装することができます。通常、カスタム例外を作成するときにその操作を行います。

+0

この時点でスタックトレースにデータが入力されていますか? – biziclop

+1

getStackTrace()はスーパータイプのメソッドで、super()が呼び出されるまで使用できません。 –

+0

申し訳ありませんが、スーパーの議論にメッセージを書くのを忘れました。より柔軟にするためには、それを置くのが最善だと思います。ところで、あなたのコードをコンパイルすることはできません: "明示的にコンストラクタを呼び出している間にインスタンスメソッドを参照することはできません"。 –

0

通常、スタックトレースの例外では、スタックトレースを使用します。

public class OtherException extends Exception { 
    public OtherException(final String message) { 
     super(message); 
    } 
} 

OtherException oe = new OtherException("Hello"); 
StackTraceElement[] stes = oe.getStackTrace(); // get stack trace. 

スタック情報は、例外が作成された時点で記録されます。実際のStackTraceElement []は、初めて使用されるときに作成されます。

関連する問題