在Java中抛出异常而不丢失堆栈跟踪

Rethrowing exceptions in Java without losing the stack trace

在C_中,我可以使用throw;语句在保留堆栈跟踪的同时重新引发异常:

1
2
3
4
5
6
7
8
9
try
{
   ...
}
catch (Exception e)
{
   if (e is FooException)
     throw;
}

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


1
2
3
catch (WhateverException e) {
    throw e;
}

只需重新引发捕获到的异常(显然,周围的方法必须通过其签名等允许这样做)。异常将保留原始堆栈跟踪。


我宁愿:

1
2
3
4
5
6
7
8
9
10
11
try
{
   ...
}
catch (FooException fe){
   throw fe;
}
catch (Exception e)
{
   ...
}


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

1
2
3
4
5
6
7
8
try
{
   ...
}
catch (Exception e)
{
     throw new YourOwnException(e);
}


在Java中几乎是一样的:

1
2
3
4
5
6
7
8
9
try
{
   ...
}
catch (Exception e)
{
   if (e instanceof FooException)
     throw e;
}


在爪哇中,您只需抛出捕获的异常,那么EDOCX1就等于0而不是EDCOX1(1)。Java维护堆栈跟踪。


1
2
3
4
5
6
7
8
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块抛出的异常。其他阅读材料可以在这里和这里找到。


像这样的东西

1
2
3
4
5
6
7
8
9
10
11
12
try
{
  ...
}
catch (FooException e)
{
  throw e;
}
catch (Exception e)
{
  ...
}

如果将捕获的摘录包装成另一个异常(以提供更多信息),或者只是重新引发捕获的摘录,则需要提供堆栈跟踪。

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