4

有没有办法找出 try 块中的哪一行抛出异常?

我正在Eclipse中处理Java,看起来像

try {

  //Lots of code. Seriously. Lots.

} catch (Exception e){
  throw new OtherException();
}

我在 try 块中遇到异常(然后被捕获)。我如何确定它是从哪里抛出的?

问题

  • 堆栈跟踪仅显示 catch 块中 OtherException 的行
  • 删除 try/catch 块并不简单,因为有许多声明为抛出的异常需要被捕获才能编译代码。

感觉应该有一种直接的方法来做到这一点。

注意:这段代码不是我写的 ;-)

4

6 回答 6

14

使用cause参数Exceptions见这里):

try {

  //Lots of code. Seriously. Lots.

} catch (Exception e){
  throw new OtherException(e); // Trick is here
}

这样,您也可以cause在堆栈跟踪中获得异常。

于 2012-05-24T16:07:17.273 回答
4

在 Eclipse 中,您可以设置由异常触发的断点。请参阅添加 Java 异常断点

对于这种特殊情况,您需要确保选中“暂停捕获的异常”。

一旦 Eclipse 进入调试器,您将拥有大量工具供您使用。您将看到调用堆栈,将能够检查变量等。

于 2012-05-24T16:06:37.153 回答
4

您可以使用throw new OtherException(e);. 正如文档所解释的,这个构造函数构造了一个具有指定原因的新异常

于 2012-05-24T16:09:37.340 回答
2

OtherException抛出异常时,在构造函数中传递异常 e 。它将为您提供完整的堆栈跟踪,其中包含引发异常的确切行:

catch (Exception e) {
    throw new OtherException(e);
}

如果OtherException没有一个构造函数,Exception或者Throwable你可以这样做:

catch (Exception e) {
    OtherException o = new OtherException();
    o.initCause(e);
    throw o;
}
于 2012-05-24T16:09:37.857 回答
2

只需打印堆栈跟踪或在调试模式下运行

e.printStackTrace()
于 2012-05-24T16:14:31.000 回答
0

您也可以尝试将错误消息打印到控制台:System.out.println(e.getMessage());

不过,断点非常有用,因为您可以跟踪代码并准确查看它何时到达 catch 块。

于 2012-05-24T16:10:25.190 回答