を失うことなく、Javaで例外を再スロー、私は、スタックトレースを維持しながら、例外を再スローするthrow;
ステートメントを使用することができます。は、C#でスタックトレース
try
{
...
}
catch (Exception e)
{
if (e is FooException)
throw;
}
Javaでこのようなものがあります(」doesnのことは、元のスタックトレースを失う)? Javaでは
を失うことなく、Javaで例外を再スロー、私は、スタックトレースを維持しながら、例外を再スローするthrow;
ステートメントを使用することができます。は、C#でスタックトレース
try
{
...
}
catch (Exception e)
{
if (e is FooException)
throw;
}
Javaでこのようなものがあります(」doesnのことは、元のスタックトレースを失う)? Javaでは
catch (WhateverException e) {
throw e;
}
は、単純に(明らかに周囲の方法は、その署名などを経てこれを許可しなければならない)あなたがキャッチしてきた例外を再スローします。例外は、元のスタックトレースを維持します。
こんにちは、InterruptedException eは、スローe行を追加すると、未処理の例外メッセージを返します。私はそれをより広い例外eと置き換えてはいけません。これはどのように適切に行われるべきですか? –
@James、私はちょうど関数の宣言で "throw XxxException"を追加するとメッセージが消え去るのを観察しました。 – shiouming
Java 7コンパイラでは、このような再利用のためには、よりインテリジェントです。今では、メソッドを含む特定の "スロー"例外でうまく動作します。 –
Javaでは、キャッチした例外をスローするだけなので、throw
ではなくthrow e
となります。 Javaはスタックトレースを維持します。
私が希望:あなたはまた別のもので例外をラップとしてのThrowableとして例外を渡すことによって、元のスタックトレースを保つことができ、この
try
{
...
}
catch (FooException e)
{
throw e;
}
catch (Exception e)
{
...
}
ジェネリックより特定の例外をキャッチし、のインスタンス。 +1 – amischiefr
このパターンはRuntimeExceptionsでうまく機能します。 –
そして、FooExceptionがチェックされていないか、または囲みメソッドのthrows部分で宣言されていることを期待してください。 C#の例外はチェックされておらず、あなたが何をしているのか分からない限り、平らな "例外"を捕まえるべきではないので、自由に再投げられます。 – akarnokd
何かを原因パラメータ:
try
{
...
}
catch (Exception e)
{
throw new YourOwnException(e);
}
よう
try
{
...
}
catch (FooException fe){
throw fe;
}
catch (Exception e)
{
...
}
また、 'Your newExceptionをスローする(...."しようとしたときにエラーが発生しました "、e);' – Julien
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ブロックからスローされた例外を保持できることを意味します。追加の資料はhereとhereです。
を使ってメッセージを追加することをお勧めします。 http://docs.oracle.com/javase/7/docs/technotes/guides/language/catch-multiple.htmlおよびhttp://stackoverflow.com/a/6889301/131160を参照してください。 –
スタックトレースは、キャッチしたexcetionを別の例外(詳細を提供する)にラップするか、キャッチされたexcetionをただ再スローする場合に生成されます。
try{ ... }catch (FooException e){ throw new BarException("Some usefull info", e); }
なぜ元のスタックトレースが失われたと思いますか?新しいSomeOtherExceptionをスローし、コンストラクタまたはinitCause()で根本的な原因を割り当てるのを忘れるとき、それを緩める唯一の方法です。 – akarnokd
これは.NETでコードがどのように動作するのかと思いますが、もはや肯定的ではありません。それをどこかで調べたり、小さなテストをしたりする価値があるかもしれません。 – ripper234
Throwableは投げても変更されません。スタックトレースを更新するには、 'fillInStackTrace()'を呼び出さなければなりません。便利なことに、このメソッドは 'Throwable'のコンストラクタで呼び出されます。 – Robert