首先让我们假设,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();
}