捕获Throwable
是一种糟糕的做法吗
例如,如下所示:
try {
// Some code
} catch(Throwable e) {
// handle the exception
}
这是一种糟糕的做法,还是我们应该尽可能具体?
发布于 2011-05-22 01:18:43
你需要尽可能的具体。否则,无法预见的bug可能会以这种方式悄悄消失。
此外,Throwable
还涵盖了Error
,这就是usually no point of return。你不想捕捉/处理它,你希望你的程序立即死掉,这样你就可以正确地修复它。
发布于 2011-05-22 01:38:51
这不是个好主意。事实上,即使是捕获Exception
通常也不是一个好主意。让我们来看一个例子:
try {
inputNumber = NumberFormat.getInstance().formatNumber( getUserInput() );
} catch(Throwable e) {
inputNumber = 10; //Default, user did not enter valid number
}
现在,假设getUserInput()阻塞了一段时间,另一个线程以最糟糕的方式停止了您的线程(它调用thread.stop() )。catch块将捕获ThreadDeath
错误。这太糟糕了。捕获该异常后,代码的行为在很大程度上是未定义的。
捕获异常时也会出现类似的问题。可能是因为InterruptException导致getUserInput()
失败,或者是在尝试记录结果时出现权限被拒绝的异常,或者是其他各种失败。您不知道哪里出了问题,因为正因为如此,您也不知道如何修复问题。
您有三个更好的选择:
1 --准确捕获您知道如何处理的异常:
try {
inputNumber = NumberFormat.getInstance().formatNumber( getUserInput() );
} catch(ParseException e) {
inputNumber = 10; //Default, user did not enter valid number
}
2 --重新抛出你遇到的任何异常,并且不知道如何处理:
try {
doSomethingMysterious();
} catch(Exception e) {
log.error("Oh man, something bad and mysterious happened",e);
throw e;
}
3 --使用finally块,这样就不必记得重新抛出:
Resources r = null;
try {
r = allocateSomeResources();
doSomething(r);
} finally {
if(r!=null) cleanUpResources(r);
}
发布于 2013-04-16 09:44:09
还要注意,当您捕获Throwable
时,您也可以捕获需要特殊处理的InterruptedException
。有关更多详细信息,请参阅Dealing with InterruptedException。
如果您只想捕获未检查的异常,则还可以考虑此模式
try {
...
} catch (RuntimeException exception) {
//do something
} catch (Error error) {
//do something
}
这样,当您修改代码并添加可能引发检查异常的方法调用时,编译器将提醒您这一点,然后您可以决定如何处理这种情况。
https://stackoverflow.com/questions/6083248
复制相似问题