异常可以分为两类:
1.可预知异常
2.不可预知异常(即runtime异常)
前者是程序员主动抛出的异常,为了给用户提示,后者可以通过提高代码质量来避免
本项目使用了ssm框架,即异常通过dao->service->action抛出,最后前端控制器中的异常处理器来捕获处理异常。
- 自定义异常类型
代码如下:
/**
* 自定义异常类型,成员为ResultInfo,用来储存错误信息以及提示
* @author x
*
*/
import com.summerzhou.base.process.result.ResultInfo;
public class ExceptionResultInfo extends Exception {
private ResultInfo resultInfo;
public ExceptionResultInfo(ResultInfo resultInfo) {
super(resultInfo.getMessage());
this.resultInfo = resultInfo;
}
public ResultInfo getResultInfo() {
return resultInfo;
}
public void setResultInfo(ResultInfo resultInfo) {
this.resultInfo = resultInfo;
}
}
其中的ResultInfo储存了异常信息
public class ResultInfo
{
public static final int TYPE_RESULT_FAIL = 0;//失败
public static final int TYPE_RESULT_SUCCESS = 1;//成功
public static final int TYPE_RESULT_WARN = 2;//警告
public static final int TYPE_RESULT_INFO = 3;//提示信息
public ResultInfo(){}
/**
* 消息提示类型
*/
private int type;
/**
* 提示代码
*/
private int messageCode;
/**
* 提示信息
*/
private String message;
/**
* 提示信息明细列表
*/
private List<ResultInfo> details;
}
对于上述的两种异常,如果捕获的是自定义的异常,直接获取里面封装的信息类
如果捕捉的是runtime Exception,则构造一个自定义的错误异常
//如果是自定义的Exception,则直接返回其中的消息信息
//如果是runtime Exception,则构建一个新的自定义异常
if(e instanceof ExceptionResultInfo) {
return (ExceptionResultInfo)e;
}else {
ResultInfo resultInfo = new ResultInfo(ResultInfo.TYPE_RESULT_FAIL, "未知错误");
return new ExceptionResultInfo(resultInfo);
}
- 自定义异常处理器
springmvc中有一个自动注册的异常处理器,即detectAllHandlerExceptionResolvers类。如果需要使用自定义的异常处理器,则实现handlerExceptionResolver接口即可
public interface HandlerExceptionResolver {
/**
* 当handler执行时,此方法试图处理Handl