为了账号安全,请及时绑定邮箱和手机立即绑定

抓住Throwable是不好的做法?

抓住Throwable是不好的做法?

慕沐林林 2019-07-30 15:03:06
抓住Throwable是不好的做法?赶上是不好的做法Throwable?例如这样的事情:try {     // Some code} catch(Throwable e) {     // handle the exception}这是一种不好的做法还是我们应该尽可能具体?
查看完整描述

3 回答

?
开满天机

TA贡献1786条经验 获得超13个赞

你需要尽可能具体。否则不可预见的错误可能会以这种方式蔓延开来。

此外,还有Throwable封面Error通常没有回报点。您不想捕获/处理它,您希望程序立即死亡,以便您可以正确地修复它。


查看完整回答
反对 回复 2019-07-30
?
陪伴而非守候

TA贡献1757条经验 获得超8个赞

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

try {
    inputNumber = NumberFormat.getInstance().formatNumber( getUserInput() );} catch(Throwable e) {
    inputNumber = 10; //Default, user did not enter valid number}

现在,假设getUserInput()阻塞了一段时间,另一个线程以最坏的方式阻止你的线程(它调用thread.stop())。你的catch块会遇到ThreadDeath错误。这太糟糕了。捕获该异常后代码的行为很大程度上是未定义的。

捕获异常会出现类似的问题。可能getUserInput()因InterruptException或尝试记录结果时出现权限被拒绝异常或其他各种故障而失败。你不知道出了什么问题,因为那样,你也不知道如何解决这个问题。

你有三个更好的选择:

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);
 }


查看完整回答
反对 回复 2019-07-30
?
沧海一幻觉

TA贡献1824条经验 获得超5个赞

另外请注意,当您捕获时Throwable,您还可以捕获InterruptedException哪些需要特殊处理。有关更多详细信息,请参阅处理InterruptedException

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

try {
   ...} catch (RuntimeException exception) {
  //do something} catch (Error error) {
  //do something}

这样,当您修改代码并添加可以抛出已检查异常的方法调用时,编译器会提醒您,然后您可以决定如何处理此情况。


查看完整回答
反对 回复 2019-07-30
  • 3 回答
  • 0 关注
  • 399 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号