长Java尝试块中的哪一行会抛出异常?

有没有办法找出哪些线在try块抛出异常?

我正在研究Eclipse中的Java,看起来像

try {

  //Lots of code. Seriously. Lots.

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

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

问题

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

感觉应该有一个简单的方法来做到这一点。

注意:我没有写这个代码;-)

0
额外 编辑
意见: 1
用断点调试可以创造奇迹。 :-)
额外 作者 Buhake Sindi,
答案:我在catch块中设置了一个断点,并检查了异常'e'。它的调用堆栈告诉我它在哪里抛出。
额外 作者 Tim Bellis,

6 答案

你可以使用 throw new OtherException(e); 。正如文档解释说,这个构造函数用指定的原因构造一个新的异常

0
额外

You can also try printing out the error message to the console: System.out.println(e.getMessage());

但是,断点是非常有用的,因为您可以跟踪代码并准确了解它何时到达catch块。

0
额外
最好记录它而不是打印堆栈跟踪
额外 作者 Qwerky,

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

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

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

0
额外

Exceptions 使用 cause 参数( see here ):

try {

  //Lots of code. Seriously. Lots.

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

这样你在栈跟踪中也得到 cause 异常。

0
额外

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

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

如果 OtherException 没有一个接受 ExceptionThrowable 的构造函数,您可以这样做:

catch (Exception e) {
    OtherException o = new OtherException();
    o.initCause(e);
    throw o;
}
0
额外

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

e.printStackTrace()
0
额外
最好记录它而不是打印堆栈跟踪。
额外 作者 Qwerky,
我明白了,但是如果只想调试错误,有时不需要登录。
额外 作者 Peerapat A,