在C#中,我可以使用throw;
语句重新抛出异常,同时保留堆栈跟踪:
try
{
...
}
catch (Exception e)
{
if (e is FooException)
throw;
}
Java中是否存在类似的内容(不会丢失原始堆栈跟踪)?
答案 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块抛出的异常。可以找到其他阅读材料here和here。
答案 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);
}