web-dev-qa-db-ja.com

スタックトレースを失うことなくJavaで例外を再スローする

C#では、スタックトレースを維持しながらthrow;ステートメントを使用して例外を再スローできます。

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

Java(にこのような元のスタックトレースを失わないもの)がありますか?

379
ripper234
catch (WhateverException e) {
    throw e;
}

キャッチした例外を単純に再スローします(明らかに周囲のメソッドはそのシグネチャなどを介してこれを許可する必要があります)。例外は元のスタックトレースを維持します。

508
Brian Agnew

を好む:

try
{
   ...
}
catch (FooException fe){
   throw fe;
}
catch (Exception e)
{
   ...
}
79
Markus Lausberg

例外をThrowableとしてcauseパラメータとして渡すことで、例外を別の例外にラップして元のスタックトレースを保持することもできます。

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

Javaでもほとんど同じです。

try
{
   ...
}
catch (Exception e)
{
   if (e instanceof FooException)
     throw e;
}
22
alves

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

13
David M

このようなもの

try 
{
  ...
}
catch (FooException e) 
{
  throw e;
}
catch (Exception e)
{
  ...
}
6
Gweg
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ブロックからスローされた例外のみを保持できることを意味します。追加の読み物はここ ここここ にあります。

5
Daniel

キャッチした例外を他の例外にラップした場合(詳細情報を提供する場合)、またはキャッチした例外を再スローした場合、スタックトレースは保持されます。

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

1
Sindre