-1

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

5 回答 5

3
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()
}

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

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

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

于 2012-12-03T08:34:52.720 回答
2

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

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

于 2012-12-03T08:32:00.640 回答
2

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

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

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

于 2012-12-03T08:34:17.863 回答
0

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

于 2012-12-03T09:02:59.080 回答
0

首先让我们假设,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,你应该得到一个错误(不应该编译)。它很聪明,并且会认识到,无论如何都不会达到第二次捕获。

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

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();
}
于 2012-12-03T09:03:51.490 回答