如何知道抛出了哪个异常

时间:2011-09-28 16:18:01

标签: java exception exception-handling

我正在对我们的代码库进行审核,有很多这样的陈述:

try
{
   doSomething()
} catch (Exception e)
{

}

但是我想知道doSomething()抛出哪个异常的方法(在doSomething的实现中没有throw语句)所以我可以捕获该异常,而不仅仅是捕获异常,即使使用findBugs它也给出了警告REC_CATCH_EXCEPTION

我应该提一下,记录异常或将其打印到控制台对我没有帮助,因为在这种情况下需要时间来重现导致异常的错误。

由于

4 个答案:

答案 0 :(得分:15)

如果throws中没有doSomething声明(例如doSomething() throws IOException),则会发生的任何异常都是RuntimeException的实例。如果您想知道doSomething抛出的异常的确切类别,您可以随时尝试

try {
   doSomething();
} catch (RuntimeException e){
   System.out.println(e.getClass().getName());
}

知道在没有实际运行程序的情况下可以抛出哪些运行时异常很困难。即使doSomething()调用的代码都没有显式抛出,核心java操作总是会使用错误的输入抛出NullPointerExceptionArrayIndexOutOfBoundsException等。以下是一些想法:

  • 手动挖掘。至少你会知道一些例外情况。
  • 使用反射查找可从doSomething
  • 访问的任何throw语句
  • 运行您的测试用例并记录上面抛出的异常。好的测试将揭示doSomething的来电者应该准备好的重要错误。
  • 首先去那些把捕获物放在那里的人

在任何情况下,捕获尽可能具体的异常通常是一个好主意,因为当您尝试处理一个子句中的所有情况时,您并不确切地知道 出错了什么。

答案 1 :(得分:2)

你可以1)挖掘doSomething()中的所有代码以及它调用的所有代码以查看异常处理以及可以抛出的RuntimeExceptions,或者2)获取catch (Exception e)并等待它失败。这是通过在方法签名中创建强类型声明来检查尝试克服的异常的问题,该声明关于调用该方法必须处理哪些异常。

答案 2 :(得分:0)

如果没有throws子句,则该方法不会抛出任何已检查的 execption。该方法的javadoc可能会提供有关该方法可以抛出的任何未经检查的异常的信息,但它不需要。

为什么你想首先捕捉到任何异常?

答案 3 :(得分:0)

您是否也想捕获编译时异常或运行时异常?如果您只想捕获编译时的块,只需删除当前的catch块 - 您将立即收到错误消息,指出某些异常未被捕获。添加一个例外后,您将看到其他人的错误消息 - 您将能够完成捕获代码块抛出的所有可能异常。