长Java'try'块中的哪一行抛出异常?

时间:2012-05-24 16:05:16

标签: java eclipse debugging exception

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

我在Eclipse中使用Java看起来像

try {

  //Lots of code. Seriously. Lots.

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

我在try块中遇到异常(然后被捕获)。我怎样弄清楚它被扔出去的地方?

问题

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

感觉应该有一种直截了当的方式。

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

6 个答案:

答案 0 :(得分:13)

使用cause Exceptions的{​​{1}}参数:{/ 3}}:

try {

  //Lots of code. Seriously. Lots.

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

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

答案 1 :(得分:4)

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

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

Eclipse进入调试器后,您可以使用大量工具。您将看到调用堆栈,将能够检查变量等。

答案 2 :(得分:4)

您可以使用throw new OtherException(e);。正如documentation所解释的,此构造函数使用指定的原因构造一个新的异常。

答案 3 :(得分:2)

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

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

如果OtherException没有可以执行ExceptionThrowable的构造函数:

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

答案 4 :(得分:2)

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

e.printStackTrace()

答案 5 :(得分:0)

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

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