首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >捕获Throwable是一种糟糕的做法吗?

捕获Throwable是一种糟糕的做法吗?
EN

Stack Overflow用户
提问于 2011-05-22 01:14:19
回答 10查看 94.1K关注 0票数 114

捕获Throwable是一种糟糕的做法吗

例如,如下所示:

代码语言:javascript
复制
try {
    // Some code
} catch(Throwable e) {
    // handle the exception
}

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

EN

回答 10

Stack Overflow用户

回答已采纳

发布于 2011-05-22 01:18:43

你需要尽可能的具体。否则,无法预见的bug可能会以这种方式悄悄消失。

此外,Throwable还涵盖了Error,这就是usually no point of return。你不想捕捉/处理它,你希望你的程序立即死掉,这样你就可以正确地修复它。

票数 109
EN

Stack Overflow用户

发布于 2011-05-22 01:38:51

这不是个好主意。事实上,即使是捕获Exception通常也不是一个好主意。让我们来看一个例子:

代码语言:javascript
复制
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 --准确捕获您知道如何处理的异常:

代码语言:javascript
复制
try {
    inputNumber = NumberFormat.getInstance().formatNumber( getUserInput() );
} catch(ParseException e) {
    inputNumber = 10; //Default, user did not enter valid number
}

2 --重新抛出你遇到的任何异常,并且不知道如何处理:

代码语言:javascript
复制
try {
    doSomethingMysterious();
} catch(Exception e) {
    log.error("Oh man, something bad and mysterious happened",e);
    throw e;
}

3 --使用finally块,这样就不必记得重新抛出:

代码语言:javascript
复制
 Resources r = null;
 try {
      r = allocateSomeResources();
      doSomething(r);
 } finally {
     if(r!=null) cleanUpResources(r);
 }
票数 40
EN

Stack Overflow用户

发布于 2013-04-16 09:44:09

还要注意,当您捕获Throwable时,您也可以捕获需要特殊处理的InterruptedException。有关更多详细信息,请参阅Dealing with InterruptedException

如果您只想捕获未检查的异常,则还可以考虑此模式

代码语言:javascript
复制
try {
   ...
} catch (RuntimeException exception) {
  //do something
} catch (Error error) {
  //do something
}

这样,当您修改代码并添加可能引发检查异常的方法调用时,编译器将提醒您这一点,然后您可以决定如何处理这种情况。

票数 22
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6083248

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档