如何知道抛出了哪个异常

Mou*_*hna 10 java exception-handling exception

我正在为我们的代码库做一个评论,有很多这样的语句:

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

}
Run Code Online (Sandbox Code Playgroud)

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

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

谢谢

tb1*_*189 15

如果(例如)中没有throws语句,则将发生的任何异常都是.如果你想知道抛出的异常的确切类,你可以随时尝试doSomethingdoSomething() throws IOExceptionRuntimeExceptiondoSomething

try {
   doSomething();
} catch (RuntimeException e){
   System.out.println(e.getClass().getName());
}
Run Code Online (Sandbox Code Playgroud)

知道在没有实际运行程序的情况下可以抛出哪些运行时异常是很困难的.即使没有该代码的doSomething()调用具有显式罚球,核心Java操作可总是抛出NullPointerException,ArrayIndexOutOfBoundsException等用了错误的输入.以下是一些想法:

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

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