猿问

抓住Throwable是不好的做法?

抓住Throwable是不好的做法?

赶上是不好的做法Throwable

例如这样的事情:

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

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


慕沐林林
浏览 400回答 3
3回答

开满天机

你需要尽可能具体。否则不可预见的错误可能会以这种方式蔓延开来。此外,还有Throwable封面Error,通常没有回报点。您不想捕获/处理它,您希望程序立即死亡,以便您可以正确地修复它。

陪伴而非守候

这是一个坏主意。事实上,即使是捕捉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);  }

沧海一幻觉

另外请注意,当您捕获时Throwable,您还可以捕获InterruptedException哪些需要特殊处理。有关更多详细信息,请参阅处理InterruptedException。如果您只想捕获未经检查的异常,则可能还会考虑此模式try {    ...} catch (RuntimeException exception) {   //do something} catch (Error error) {   //do something}这样,当您修改代码并添加可以抛出已检查异常的方法调用时,编译器会提醒您,然后您可以决定如何处理此情况。
随时随地看视频慕课网APP

相关分类

Java
我要回答