2009-07-08 12 views
321

を失うことなく、Javaで例外を再スロー、私は、スタックトレースを維持しながら、例外を再スローするthrow;ステートメントを使用することができます。は、C#でスタックトレース

try 
{ 
    ... 
} 
catch (Exception e) 
{ 
    if (e is FooException) 
    throw; 
} 

Javaでこのようなものがあります(」doesnのことは、元のスタックトレースを失う)? Javaでは

+3

なぜ元のスタックトレースが失われたと思いますか?新しいSomeOtherExceptionをスローし、コンストラクタまたはinitCause()で根本的な原因を割り当てるのを忘れるとき、それを緩める唯一の方法です。 – akarnokd

+3

これは.NETでコードがどのように動作するのかと思いますが、もはや肯定的ではありません。それをどこかで調べたり、小さなテストをしたりする価値があるかもしれません。 – ripper234

+9

Throwableは投げても変更されません。スタックトレースを更新するには、 'fillInStackTrace()'を呼び出さなければなりません。便利なことに、このメソッドは 'Throwable'のコンストラクタで呼び出されます。 – Robert

答えて

424
catch (WhateverException e) { 
    throw e; 
} 

は、単純に(明らかに周囲の方法は、その署名など​​を経てこれを許可しなければならない)あなたがキャッチしてきた例外を再スローします。例外は、元のスタックトレースを維持します。

+3

こんにちは、InterruptedException eは、スローe行を追加すると、未処理の例外メッセージを返します。私はそれをより広い例外eと置き換えてはいけません。これはどのように適切に行われるべきですか? –

+1

@James、私はちょうど関数の宣言で "throw XxxException"を追加するとメッセージが消え去るのを観察しました。 – shiouming

+2

Java 7コンパイラでは、このような再利用のためには、よりインテリジェントです。今では、メソッドを含む特定の "スロー"例外でうまく動作します。 –

23

はほぼ同じである:

try 
{ 
    ... 
} 
catch (Exception e) 
{ 
    if (e instanceof FooException) 
    throw e; 
} 
+0

Doesn '元のスタックトレースを変更/失うことはありませんか? – ripper234

+4

いいえ、新しいExceptionオブジェクトをインスタンス化しない限り、スタックトレースは同じままです。 – Mnementh

+23

FooExceptionの特定のcatchを追加します。 – dfa

13

Javaでは、キャッチした例外をスローするだけなので、throwではなくthrow eとなります。 Javaはスタックトレースを維持します。

76

私が希望:あなたはまた別のもので例外をラップとしてのThrowableとして例外を渡すことによって、元のスタックトレースを保つことができ、この

try 
{ 
    ... 
} 
catch (FooException e) 
{ 
    throw e; 
} 
catch (Exception e) 
{ 
    ... 
} 
+4

ジェネリックより特定の例外をキャッチし、のインスタンス。 +1 – amischiefr

+2

このパターンはRuntimeExceptionsでうまく機能します。 –

+0

そして、FooExceptionがチェックされていないか、または囲みメソッドのthrows部分で宣言されていることを期待してください。 C#の例外はチェックされておらず、あなたが何をしているのか分からない限り、平らな "例外"を捕まえるべきではないので、自由に再投げられます。 – akarnokd

5

何かを原因パラメータ:

try 
{ 
    ... 
} 
catch (Exception e) 
{ 
    throw new YourOwnException(e); 
} 
58

よう

try 
{ 
    ... 
} 
catch (FooException fe){ 
    throw fe; 
} 
catch (Exception e) 
{ 
    ... 
} 
+3

また、 'Your newExceptionをスローする(...."しようとしたときにエラーが発生しました "、e);' – Julien

5
public int read(byte[] a) throws IOException { 
    try { 
     return in.read(a); 
    } catch (final Throwable t) { 
     /* can do something here, like in=null; */ 
     throw t; 
    } 
} 

これは、メソッドがIOExceptionをスローする具体的な例です。 finalは、tがtryブロックからスローされた例外を保持できることを意味します。追加の資料はherehereです。

+1

を使ってメッセージを追加することをお勧めします。 http://docs.oracle.com/javase/7/docs/technotes/guides/language/catch-multiple.htmlおよびhttp://stackoverflow.com/a/6889301/131160を参照してください。 –

0

スタックトレースは、キャッチしたexcetionを別の例外(詳細を提供する)にラップするか、キャッチされたexcetionをただ再スローする場合に生成されます。

try{ ... }catch (FooException e){ throw new BarException("Some usefull info", e); }

関連する問題