[英]chained exception facility in JAVA
我可以在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
我的问题是:
区别在于,在第二种情况下,您将原始ArithmeticException
异常包装在另一个相同类型的异常中(请参见下面的说明,这是毫无意义的)。
案例1可能是您要在这里使用的,因为您没有将异常的含义扩展到更高的层次。
他们有不同的目的,让我解释一下...
如果将异常设置为原因,则它的含义不同。 通过将其包装在更高级别的异常中,可以赋予ArithmeticException
更大的含义。 在这里,您只是将其包装在另一个ArithmeticException
,这没有任何意义。
例如,当您尝试从Web服务中获取一些数据时,可能会引起原因:发送HTTP请求的低级方法抛出一些SocketException
或HttpException
,然后将它们包装在一些高级异常中,这些异常描述了哪些资源无法加载(例如)。
您应该将cause作为构造函数参数传递,而不是调用initCause。
在实际代码中,看不到包装相同类型异常的异常。 关键是将实现级别的异常包装在更高级别的内容中,以便捕获该异常的代码没有很多要处理的特定于实现的特殊情况(并且实现细节不会渗漏到代码的某些部分)不需要关心的代码),而链接可确保保留原始的堆栈跟踪。
所以你会做类似的事情:
private static void method1() throws HigherLevelException {
try{
System.out.println("Inside Try Block"+10/0);
} catch(ArithmeticException e){
throw new HigherLevelException(e);
}
}
由于许多人认为检查异常是失败的实验(甚至不是点网都选择复制它们),因此在许多情况下,较高级别的异常往往是未经检查的异常。 您将在Spring和Hibernate中看到这种模式。
在您的第一个示例中,捕获异常只是为了重新抛出异常就没有必要了。 stacktrace应该足以确定在哪里生成异常,而不必记录和重新抛出。 确保您拥有一个可捕获和记录异常的集中位置。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.