繁体   English   中英

以下try-catch语句有什么区别?

[英]What is the difference between the following try-catch statements?

这些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();
}
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块以获取更具体的异常,然后是广义异常。 现在,在您的情况下,第2个c​​atch块应该处理的所有异常都将在第一个中处理。

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

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

好吧,第一个和另外两个之间的明显区别是,无论doSomthing1是否引发异常, doSomthing2将尝试doSomthing1 在您引用的确切代码中,除了第三个示例之外,第二个和第三个示例之间没有很大区别(除了语法错误),第二次try的异常处理代码在第一个示例的异常处理代码之 ,因此如果抛出该异常,该异常将被捕获。

您应该使用哪种完全取决于情况。 有时,它是适合运行doSomthing2是否doSomthing1抛出异常。 有时候不是。

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

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

而第三个示例与第二个示例相似。

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

首先让我们假设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子句的顺序降低了,上部catch不应成为底部子句的父级,因为ANYWAY父级都会接受该异常,并且不会到达底部的子级。

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(不要忘记出现错误,因为第二个错误无法到达)。 但我知道您想问什么。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM