在一个很长的Java 'try'块中,哪一行抛出了异常?

4
有没有办法找出try块中哪一行抛出了异常?
我正在Eclipse中使用Java。
try {

  //Lots of code. Seriously. Lots.

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

我在try块中遇到了一个异常,然后被捕获了。我该如何找出它是从哪里抛出来的?
问题:
  • 堆栈跟踪仅显示OtherException的catch块中的行
  • 删除try/catch块并不简单,因为有许多声明为抛出的异常必须被捕获才能编译代码。
感觉应该有一种简单的方法来解决这个问题。
注意:我没有编写这段代码;-)

我在 catch 块中设置了断点并检查了异常 'e'。它的调用堆栈告诉我它是在哪里抛出的。 - Tim Bellis
使用断点调试可以事半功倍。 :-) - Buhake Sindi
6个回答

14

使用cause参数处理Exceptions查看此处):

try {

  //Lots of code. Seriously. Lots.

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

这样你就可以在堆栈跟踪中获取cause异常。


4
在Eclipse中,您可以设置由异常触发的断点。请参见添加Java异常断点
对于这种特定情况,您需要确保选中“在捕获的异常上暂停”。
一旦Eclipse进入调试器,您将拥有许多工具可供使用。您将看到调用堆栈,并能够检查变量等。

4
您可以使用throw new OtherException(e);。如文档所述,此构造函数使用指定的原因构造新异常

2

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

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

如果 OtherException 没有接受 ExceptionThrowable 的构造函数,则可以执行以下操作:
catch (Exception e) {
    OtherException o = new OtherException();
    o.initCause(e);
    throw o;
}

2
只需打印堆栈跟踪或在调试模式下运行即可。
e.printStackTrace()

记录日志比打印堆栈跟踪更好。 - Qwerky
我明白,但有时候如果你只想调试错误,登录是不必要的。 - Peerapat A

0

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

然而,断点非常有用,因为你可以跟踪代码并确切地看到它何时到达catch块。


最好记录日志而不是打印堆栈跟踪。 - Qwerky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接