虽然JAVA已经拥有一系列的异常类,但在实际项目中,我们依然需要根据业务对异常进行封装及细分,让程序的错误更加地精确,清晰。
经过对[JAVA异常处理机制]{http://blog.csdn.net/gongm24/article/details/69815114}的学习,我们知道所有的异常类都继承自Throwable,而Throwable又分为Error及Exception,而我们要自定义异常类,应该是属于Exception分支下,所以通过继承Exception来实现自定义异常类是一个好的选择。
首先查看一下Exception的源码
public class Exception extends Throwable {
public Exception() {
super();
}
public Exception(String message) {
super(message);
}
public Exception(String message, Throwable cause) {
super(message, cause);
}
public Exception(Throwable cause) {
super(cause);
}
protected Exception(String message, Throwable cause,
boolean enableSuppression,
boolean writableStackTrace) {
super(message, cause, enableSuppression, writableStackTrace);
}
}
源码中只有几个构造方法,而我们关注的焦点则放在message及cause两个属性上。
message:用户自定义错误信息,通过设置message我们可以使用用户可以看明白的语言表述错误。
cause:错误源,Throwable类型,可以设置当前异常是由什么异常引起,通过cause我们可以向上查找当前异常的源头,从而可以获取最原始的错误信息。
自定义异常类最关注的其实也是这两个属性,另外就是根据业务需要添加自定义属性。
比如:我们现在针对数据库操作异常进行统一封装,不光要有错误信息提示,还需要有相应错误代码,并且保存原始异常,可以根据当前异常寻找到原始异常,获取异常信息并打印。
public class DaoException extends Exception {
private static final long serialVersionUID = 1L;
private String errorCode;
public DaoException(String errorCode, String msg) {
super(msg);
this.errorCode = errorCode;
}
public DaoException(String errorCode, String msg, Throwable cause) {
super(msg, cause);
this.errorCode = errorCode;
}
}
使用方法:
public int save(Object o) {
try {
// save action
} catch (Exception e) {
throw new DaoException("00100", "数据插入出错");
}
}
这样就实现了一个简单的自定义异常类
很多时候,自定义异常类甚至不是为了处理什么业务问题,而仅仅是希望对异常进行细分,这样的自定义异常类内部没有任何其它逻辑,只是在发生异常时,我们可以根据不同的异常类名称判断出来是在什么地方发生的异常。实际项目中经常这样使用。