繁体   English   中英

JAVA中的链式异常设施

[英]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

我的问题是:

  1. 这两种情况有什么区别吗?
  2. 哪个更好的方法?
  3. 又为什么有2个案件出于相同目的?
  1. 区别在于,在第二种情况下,您将原始ArithmeticException异常包装在另一个相同类型的异常中(请参见下面的说明,这是毫无意义的)。

  2. 案例1可能是您要在这里使用的,因为您没有将异常的含义扩展到更高的层次。

  3. 他们有不同的目的,让我解释一下...

如果将异常设置为原因,则它的含义不同。 通过将其包装在更高级别的异常中,可以赋予ArithmeticException更大的含义。 在这里,您只是将其包装在另一个ArithmeticException ,这没有任何意义。

例如,当您尝试从Web服务中获取一些数据时,可能会引起原因:发送HTTP请求的低级方法抛出一些SocketExceptionHttpException ,然后将它们包装在一些高级异常中,这些异常描述了哪些资源无法加载(例如)。

您应该将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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM