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

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

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


当前回答

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

其他回答

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

就像这样

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

我只是有一个类似的情况,我的代码可能会抛出一些不同的异常,我只是想重新抛出。上面描述的解决方案不适合我,因为Eclipse告诉我throw e;导致一个未处理的异常,所以我这样做了:

try
{
...
} catch (NoSuchMethodException | SecurityException | IllegalAccessException e) {                    
    throw new RuntimeException(e.getClass().getName() + ": " + e.getMessage() + "\n" + e.getStackTrace().toString());
}

为我工作....:)

catch (WhateverException e) {
    throw e;
}

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

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的一个具体示例。最后一种方法是t只能保存try块抛出的异常。其他阅读材料可以在这里和这里找到。