如果另一个异常吃掉它,我应该在顶部异常中保留对原始异常的引用吗?

时间:2014-06-13 10:53:48

标签: java exception exception-handling try-catch

考虑这个自定义Exception类:

public class CustomException extends Exception {

    private static final long serialVersionUID = 1L;

    public static final int EXCEPTION1 = 1;
    public static final int EXCEPTION2 = 2;
    public static final int EXCEPTION3 = 3;

    private int exceptionType;
    private Throwable guiltyException;

    public CustomException(String message, int type, Throwable cause){
        super(message);
        this.exceptionType = type;
        this.guiltyException = cause;
    }

    public int getExceptionType(){
        return this.exceptionType;
    }

    public Throwable getGuiltyException(){
        return this.guiltyException;
    }

}

然后假设有一个方法,例如:

public SomeReturnType someMethod(SomeArgument argument) throws CustomException{
    try{
        someExceptionalMethodCall(); // Throws Exception1, Exception2, Exception3
    } catch (Exception1 e1) {
        throw new CustomException("Some info1", CustomException.EXCEPTION1, e1);
    } catch (Exception2 e2) {
        throw new CustomException("Some info2", CustomException.EXCEPTION2, e2);
    } catch (Exception3 e3) {
        throw new CustomException("Some info3", CustomException.EXCEPTION3, e3);
    }
}

通过调整Throwable构造函数中对super的{​​{1}}调用,我可以避免存储Exception只是无意义的开销吗?像这样:

CustomException

然后我可以摆脱public CustomException(String message, int type, Throwable cause){ super(message, cause); this.exceptionType = type; } guiltyException

getGuiltyException 类中存储 Throwable 原因是否有任何意义?

2 个答案:

答案 0 :(得分:2)

不,当Throwable已经拥有该设施时,没有理由自己存储原因。您的类应该只引入额外的信息,而不是已经有意义的重复字段。

除了其他任何内容,我希望能够调用getCause()并检索原始异常 - 而在原始代码中,我必须知道它是{ {1}},并致电CustomException。这种情况的一个症状是,记录错误的任何通用代码都不会在当前版本中看到原因 - 而如果您使用标准方法进行异常链接则会出现这种情况。

答案 1 :(得分:2)

您不需要保留对异常原因的引用,因为这可以在super(message, cause)构造函数中设置。