抓住Shrewable是一种不好的做法吗?

2022-08-31 09:11:58

捕捉是一种不好的做法吗?Throwable

例如,像这样:

try {
    // Some code
} catch(Throwable e) {
    // handle the exception
}

这是一种不好的做法,还是我们应该尽可能具体?


答案 1

您需要尽可能具体。否则,不可预见的错误可能会以这种方式悄悄消失。

此外,Throwable也涵盖了错误,这通常没有回报点。你不想抓住/处理它,你希望你的程序立即死亡,这样你就可以正确地修复它。


答案 2

这是个坏主意。事实上,即使捕捉通常也是一个坏主意。让我们考虑一个例子: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);
 }

推荐