考虑这个自定义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
原因是否有任何意义?
答案 0 :(得分:2)
不,当Throwable
已经拥有该设施时,没有理由自己存储原因。您的类应该只引入额外的信息,而不是已经有意义的重复字段。
除了其他任何内容,我希望能够调用getCause()
并检索原始异常 - 而在原始代码中,我必须知道它是{ {1}},并致电CustomException
。这种情况的一个症状是,记录错误的任何通用代码都不会在当前版本中看到原因 - 而如果您使用标准方法进行异常链接则会出现这种情况。
答案 1 :(得分:2)
您不需要保留对异常原因的引用,因为这可以在super(message, cause)
构造函数中设置。