2010-12-31 18 views
9

スタックトレース/例外に情報を追加したいと思います。基本的に私は私が本当に好きになりましたが、このようなものを、持っている例外への情報の追加

:私はまだ元のスタックを持ちながら、その例外をキャッチし、それに追加の情報を追加したいのですが

Exception in thread "main" java.lang.ArithmeticException:/by zero 
    at com.so.main(SO.java:41) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke 

トレース。例えば

、私はそれを持ってしたいと思います:

Exception in thread "main" CustomException:/by zero (you tried to divide 42 by 0) 
    at com.so.main(SO.java:41) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke 

だから、基本的に、私はを「あなたは0で42を分割しようとした」を追加(CustomException、たとえば、はArithmeticExceptionおよび再スローをキャッチしたいですこの例では、元のArithmeticExceptionからスタックトレースを保持したままです)。

Javaでこれを行う正しい方法は何ですか?

には、以下の正しいです:

try { 
    .... 
} catch (ArithmeticException e) { 
    throw new CustomException("You tried to divide " + x + " by " + y, e); 
} 
+0

あなたが例外を投げた人ではない場合、どのように例外の詳細を知ることができますか? – Falmarri

+0

@Falmarri:具体性はわかりませんが、メソッドパラメータのような追加の情報を追加できます。私は私の質問の最後に例を追加しました。 – NoozNooz42

+0

通常、この情報はデバッグにのみ役立ちます。デバッガを使用してプログラムをデバッグし、例外にブレークポイントを配置することもできます。例外がスローされると、それを引き起こした条件が表示されます。 –

答えて

11

はい、あなたは、Java 1.4のようなJavaでそのような巣の例外を、ことができます。私はいつもこれをやる。 http://download.oracle.com/javase/1.4.2/docs/api/java/lang/Throwable.htmlを参照してください。

カスタム例外からスタックトレースを印刷すると、CustomExceptionスタックトレースと入れ子になったArithmeticExceptionのスタックトレースの両方が表示されます。あなたは任意に深く入れ子にすることができます。

+0

+1、ありがとうございます。それは長い時間以来そこにいることに興味を持っています:) – NoozNooz42

+0

リンクが死んだ[悲しい顔] – meawoppl

10

また、これを行うことができます:

あなたを与えるだろう
try { 
    .... 
} catch (ArithmeticException e) { 
    ArithmeticException ae = new ArithmeticException("You tried to divide " + x + " by " + y+" "+e.getMessage()); 
    ae.setStackTrace(e.getStackTrace()); 
    throw ae; 
} 

アップデート[27-9月-2012] :-) "見えない" 例外:Javaの7では

:他のクールなトリックです:

try { 
    ... 
} catch (ArithmeticException e) { 
    e.addSuppressed(new ArithmeticException("You tried to divide " + x + " by " + y)); 
    throw e; 
} 
+0

+1も... "見えない"によって、あなたは2つではなく1つのスタックトレースがあることを意味しますか? – NoozNooz42

+1

私はあなたの回答を編集することができません(私は十分な担当者がいません)が、私はあなたがカット/ペーストし、ArithmeticExceptionを作成する行の最後に削除する必要がある* "、e" *を残したと思います。 – NoozNooz42

+0

はい、スタックトレースは1つだけです。そして、エラーに気づいてくれてありがとう。 – Pat

関連する問題