我可以在Java中实现链接的Exception设施为
情况1:
public static void main(String[] args) {
try {
method1();
} catch (Exception e) {
System.out.println("Exception in the main method :: "+e);
}
}
private static void method1() throws Exception {
try{
System.out.println("Inside Try Block"+10/0);
} catch(ArithmeticException e){
System.out.println("Exception in method1 :: "+e);
throw e;
} finally{
System.out.println("In FinallY Block");
}
}
情况2:
public static void main(String[] args) {
try {
method1();
} catch (Exception e) {
System.out.println("Exception in the main method :: "+e);
}
}
private static void method1() throws Exception {
try{
System.out.println("Inside Try Block"+10/0);
} catch(ArithmeticException e){
System.out.println("Exception in method1 :: "+e);
throw (ArithmeticException)new ArithmeticException().initCause(e);
} finally{
System.out.println("In FinallY Block");
}
}
我得到的输出为
Exception in method1 :: java.lang.ArithmeticException: / by zero
In FinallY Block
Exception in the main method :: java.lang.ArithmeticException: / by zero
我的问题是:
这两种情况有什么区别吗?
哪个更好的方法?
为何2个案件出于相同目的?
最佳答案
区别在于,在第二种情况下,您将原始的ArithmeticException
异常包装在另一个相同类型的异常中(请参见下面的说明,这是毫无意义的)。
案例1可能是您要在这里使用的,因为您没有将异常的含义扩展到更高的层次。
他们有不同的目的,让我解释一下...
如果将异常设置为原因,则它的含义不同。通过将ArithmeticException
包装在更高级别的异常中,可以赋予它更大的含义。在这里,您只是将其包装在另一个ArithmeticException
中,这没有任何意义。
例如,当您尝试从Web服务中获取某些数据时,可能是原因所在:发送HTTP请求的低级方法会抛出一些SocketException
或HttpException
,然后将它们包装在更高级别中描述无法加载哪些资源的异常(例如)。