在c#中,我可以使用throw;语句在保留堆栈跟踪的同时重新抛出异常:

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

Java中是否有类似的东西(不会丢失原始堆栈跟踪)?


当前回答

catch (WhateverException e) {
    throw e;
}

将简单地重新抛出您捕获的异常(显然,周围的方法必须通过其签名等允许这样做)。异常将维护原始堆栈跟踪。

其他回答

在Java中几乎是一样的:

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

将简单地重新抛出您捕获的异常(显然,周围的方法必须通过其签名等允许这样做)。异常将维护原始堆栈跟踪。

在Java中,您只需抛出捕获的异常,因此抛出e而不是抛出。Java维护堆栈跟踪。

我更喜欢:

try
{
    ...
}
catch (FooException fe){
   throw fe;
}
catch (Exception e)
{
    // Note: don't catch all exceptions like this unless you know what you
    // are doing.
    ...
}

就像这样

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