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

问题描述 投票:377回答:8

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

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

在Java中有这样的东西(不会丢失原始堆栈跟踪)吗?

java exception
8个回答
505
投票
catch (WhateverException e) {
    throw e;
}

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


79
投票

我会比较喜欢:

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

71
投票

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

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

22
投票

在Java中几乎是一样的:

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

13
投票

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


6
投票

这样的事情

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

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

这是一个具体的例子,该方法抛出IOExceptionfinal意味着t只能持有try块抛出的异常。其他阅读材料可以找到herehere


1
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.