在不丢失堆栈跟踪的情况下重新使用Java中的异常

时间:2009-07-08 11:40:29

标签: java exception

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

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

Java中是否存在类似的内容(不会丢失原始堆栈跟踪)?

9 个答案:

答案 0 :(得分:506)

catch (WhateverException e) {
    throw e;
}

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

答案 1 :(得分:79)

我更愿意:

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

答案 2 :(得分:71)

您还可以将异常包装在另一个异常中并通过将Exception作为Throwable作为cause参数传递来保留原始堆栈跟踪:

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

答案 3 :(得分:22)

在Java中几乎是一样的:

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

答案 4 :(得分:13)

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

答案 5 :(得分:6)

类似这样的事情

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

答案 6 :(得分: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

答案 7 :(得分:2)

我当时也遇到类似的情况,其中我的代码可能引发许多我想重新抛出的异常。上述解决方案不适用于我,因为Eclipse告诉我throw e;导致了未处理的异常,所以我只是这样做了:

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

为我工作。...:)

答案 8 :(得分:1)

如果你将捕获的版本包装到另一个例外(提供更多信息)或者你只是重新抛出了捕获的版本,那么堆栈跟踪就会被破坏。

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