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

时间:2012-12-03 08:29:36

标签: java try-catch code-standards

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

5 个答案:

答案 0 :(得分: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()
}

如果doSomthing2()失败,我们可以通过这种方式使用try-catch块来阻止doSomthing1()方法执行。我们可以使用两个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块内继续。

答案 1 :(得分:2)

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

您应该使用哪种方式完全取决于具体情况。有时,无论doSomthing2是否抛出异常,运行doSomthing1都是合适的。有时它不是。

答案 2 :(得分:2)

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

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

然而,第三个例子类似于第二个例子。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

首先让asume,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将被执行(不要忘记第二个无法访问时出现错误)。但我明白你想问的是什么。

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