抓住Shrewable是一种不好的做法吗?
2022-08-31 09:11:58
捕捉是一种不好的做法吗?Throwable
例如,像这样:
try {
// Some code
} catch(Throwable e) {
// handle the exception
}
这是一种不好的做法,还是我们应该尽可能具体?
捕捉是一种不好的做法吗?Throwable
例如,像这样:
try {
// Some code
} catch(Throwable e) {
// handle the exception
}
这是一种不好的做法,还是我们应该尽可能具体?
这是个坏主意。事实上,即使捕捉通常也是一个坏主意。让我们考虑一个例子: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);
}