【问题标题】:What is the difference between the following try-catch statements?以下 try-catch 语句有什么区别?
【发布时间】:2012-11-20 16:51:11
【问题描述】:

try-catch 块的这些用法之间有什么区别以及何时应该使用每个块?

try {
  doSomething1();
} catch(Exception e1){
  exception_handle1();
}
try {
  doSomething2();
} catch(Exception e2){
  exception_handle2();
}

try {
  doSomething1();
  doSomething2();
} catch(Exception e1) {
  exception_handle1();
} catch(Exception e2) {
  exception_handle2();
}

try {
  doSomething1();
  try {
    doSomething2();
  } catch(Exception e2){
    exception_handle2();
  }
} catch(Exception e1){
  exception_handle1();
}

【问题讨论】:

  • 令人惊讶的是,所有这些都是语法错误。
  • 第一个与第二个非常相似,如果您正在寻找一般的异常。除非您使异常更具体(例如 IOException、MathException 等),否则它们几乎相同。
  • 这是什么问题!在 Eclipse 中尝试一下!
  • 第三种情况与第二种情况略有不同 - 如果您考虑 Exception 的子类(而不是 java.lang.Exception)。实际上,在第二种情况下,第一个 catch 将捕获所有异常,并且永远不会调用第二个处理程序。

标签: java try-catch code-standards


【解决方案1】:
try {
  doSomthing1()
catch(Exception e1){
  exception_handle1()
}
try {
  doSomthing2()
catch(Exception e2){
  exception_handle2()
}

doSomthing1()doSomthing2() 是不相关的方法。其中任何一个的失败都是相互独立的。

try {
  doSomthing1()
  doSomthing2()
catch(Exception e1){
  exception_handle1()
}catch(Exception e2){
  exception_handle2()
}

如果doSomthing1() 失败,我们可以通过这种方式使用try-catch 块来阻止doSomthing2() 方法的执行。我们可以使用两个 catch 块单独处理每个异常。但是,需要注意的重要一点是,您的2nd catch blockunreachable code。一般来说,您应该首先为更具体的异常设置 catch 块,然后是通用异常。现在,在您的情况下,第二个 catch 块应该处理的所有异常都将在第一个中处理。

try {
  doSomthing1()
  try {
    doSomthing2()
  catch(Exception e2){
    exception_handle2()
  }
}
catch(Exception e1){
  exception_handle1()
}

我们有 2 个相互嵌入的 try-catch 块。即使在doSomthing2() 失败后,程序也会在try 块内继续。

【讨论】:

    【解决方案2】:

    嗯,第一个和另外两个之间的明显区别是doSomthing2 将被尝试,无论doSomthing1 是否抛出异常。在您引用的确切代码中,除了第三个示例之外,第二个和第三个示例(除了语法错误)之间没有太大区别,您对第二个 try 的异常处理代码是 within em> 第一个异常处理代码,所以如果它抛出,就会被捕获。

    您应该使用哪个完全取决于具体情况。有时,无论doSomthing1 是否引发异常,都适合运行doSomthing2。有时不是。

    【讨论】:

    • 您的意思是doSomething2 将在第一个代码中执行吗?实际上,您的第一个陈述令人困惑。您可能想要更新它。
    • @RohitJain:是的,在第一个示例中,无论doSomthing1是否抛出,都会执行doSomthing2;在第二个和第三个,它不会。我的第一个陈述有什么令人困惑的地方? (我刚才纠正了一个错字,也许是这样?)
    • 哦,是的。就是这样。没有刷新页面。我的错。
    • @RohitJain:或者我的首先是打字错误。 :-)
    【解决方案3】:

    如果 doSomThing1 失败,则代码继续执行 doSomthing2

    在第二个示例中,如果 doSomthing1 失败,则不会执行 doSomthing2

    然而,第三个示例与第二个类似。

    【讨论】:

      【解决方案4】:

      首先让我们假设,doSomething1() 和 exceltion_handle1(),不要调用 System.exit(x) 什么的。

      1) 所以第一段代码会 doSomething1(),不管 doSomething1() 是否会抛出任何异常,它都会处理它(处理 catch 代码块)并前进到第二次尝试并以相同的方式运行它.

      try {
        doSomething1();
      } catch(Exception e1){
        exception_handle1();
      }
      try {
        doSomething2();
      } catch(Exception e2){
        exception_handle2();
      }
      

      现在是早上,所以我希望我不会做出任何错误的决定。

      2) 这段代码会运行doSomething1()然后doSomething2(),不管哪个会失败(抛出异常),只会调用第一个catch子句,因为它吸收了所有的子类和它自己,所以第二个catch赢了' 无法达到(首先考虑所有可能的例外情况)。 所以afaik,你应该得到一个错误(不应该编译)。它很聪明,并且会认识到,无论如何都不会达到第二次捕获。

      正确的模式是:当我们深入研究时,异常应该越来越广泛(严格地)。这是合乎逻辑的,随着 catch 子句的顺序下降,upper catch 不应该是底部子句的父级,因为无论如何父级都会接受该异常,并且不会到达底部的子级。

      Example: (I recommend you to learn about Multicatch in java.)
      catch (Specific2ChildOfSpecific1 e3)
      ...
      catch (specific1ChildOfException e2)
      ...
      catch (Exception e1)
      
      
      try {
        doSomething1();
        doSomething2();
      } catch(Exception e1) {
        exception_handle1();
      } catch(Exception e2) {
        exception_handle2();
      }
      

      3) 这个:如果 doSomething1() 失败,则执行 e1 catch 子句,仅此而已,如果通过,则如果 doSomething2() 将运行,如果失败,则执行 e2 catch 子句。

      注意@第二个例子,无论哪个 doSomething 会失败,都会执行 e1 (不要忘记有一个错误,因为 second 不可达)。不过我明白你想问什么。

      try {
        doSomething1();
        try {
          doSomething2();
        } catch(Exception e2){
          exception_handle2();
        }
      } catch(Exception e1){
        exception_handle1();
      }
      

      【讨论】:

        【解决方案5】:

        创建条件语句时的概念相同,只是条件语句正在测试条件,而 try catch 正在测试错误

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-11-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-09-09
          • 1970-01-01
          相关资源
          最近更新 更多