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

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

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

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


#1楼

在Java中几乎是相同的:

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

#2楼

catch (WhateverException e) {
    throw e;
}

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


#3楼

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


#4楼

我会比较喜欢:

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

#5楼

像这样的东西

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

#6楼

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

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

#7楼

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;
    }
}

这是一个具体的示例,其中该方法引发IOExceptionfinal手段t只能容纳从try块抛出的异常。 其他阅读材料可在此处此处找到。


#8楼

如果将捕获到的兴奋剂包装到另一个异常中(以提供更多信息),或者只是重新抛出捕获到的兴奋剂,则会使用堆栈跟踪。

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


#9楼

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

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

为我工作.... :)

发布了0 篇原创文章 · 获赞 2 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/asdfgh0077/article/details/104232149