使用方法取决于异常是应由someFunction()方法的客户端处理还是应在异常发生时即在someFunction()方法内部进行捕获和处理.
在异常嵌套的情况下,不需要嵌套.
您可以使用一个try语句,然后将可能会生成异常的两个调用放在其中.
如果在两个调用的方法之一中发生异常,则在catch语句之一中结束,因此仅当第一个未引发捕获的异常时才执行第二个方法.
它产生的结果与您的代码完全相同,但是只需尝试一次,而且不会嵌套,可读性较差.
public void someFunction() {
try {
function1();
function2();
...
} catch (Func1Exception e) {
System.out.println("Function 1 failed!");
}
catch (Func2xception e) {
System.out.println("Function 2 failed!");
}
}
如果您在catch语句后还有一些其他指令并且希望即使在捕获了预期的异常之一的情况下仍要执行这些指令,则此方法非常适合.
异常返回情况表明了一个非常接近的问题.
可以通过一次尝试将其重构:
public void someFunction() {
try {
function1();
function2();
...
} catch (Func1Exception e) {
System.out.println("Function 1 failed!");
return;
}
catch (Func2xception e) {
System.out.println("Function 2 failed!");
return;
}
}
...
}
如果您在catch语句后还有其他说明,并且不希望在捕获到预期异常之一的情况下执行这些指令,则此方法非常适合.
尽管如此,对于这两种情况,如果两个异常(Func1Exception和Func2xception)的异常处理相同,则可以将它们分组在单个catch语句中:
public void someFunction() {
try {
function1();
function2();
...
}
catch (Func1Exception | Func2xception e) {
System.out.println("Function 1 or 2 failed!");
}
}
最后,仅当异常应由方法的客户端处理时,将异常添加到方法签名的情况下才有意义.