在一些Web管理系统项目中,自定义异常最为常见,为什么要自定义异常呢?主要还是为了统一所有异常,例如:如何用户在用该系统时,突然发生异常或者错误,用户是看不明白的,所以要友好地提示用户。要解决这个问题可以用Spring MVC框架提供的接口来实现自定义异常。
- 首先,创建一个自定义异常类,该类继承异常类
public class CustomException extends Exception {
private static final long serialVersionUID = -940735128639411704L;
// 异常信息
private String message;
public CustomException(String message) {
super(message);
this.message = message;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
@Override
public String toString() {
return "CustomException [message=" + message + "]";
}
}
- 在要捕获方法中抛出自定义异常CustomException给异常处理器处理
@LogAnnotation(operateType="修改角色")
@Override
public ResultInfo updateRoleList(URole uRole) throws CustomException {
try {
userRoleMapper.updateRoleList(uRole);
} catch (Exception e) {
throw new CustomException("修改失败");
}
return ResultInfo.setResultInfo(true, "修改成功");
}
- 在SpringMVC提供了HandlerExceptionResolver异常处理器接口,该处理器就处理一个业务逻辑:如果捕捉到自定义异常,那么就把自定义异常的错误信息取出。如果捕捉到运行时异常,那么就给出一个错误信息“未知错误"。如果是异步请求的话,就以JSON数据返回错误信息到页面上,否则为同步请求,把错误信息返回到错误页面上。
public class CustomExceptionResolver implements HandlerExceptionResolver {
// 自定义异常处理器
@Override
public ModelAndView resolveException(HttpServletRequest request,
HttpServletResponse response, Object object, Exception exception) {
// 判断是否ajax请求
if (!(request.getHeader("accept").indexOf("application/json") > -1 || (request
.getHeader("X-Requested-With") != null && request.getHeader(
"X-Requested-With").indexOf("XMLHttpRequest") > -1))) {
// 对于非ajax请求,我们都统一跳转到error.jsp页面
// 如果抛出的是系统自定义异常则直接转换
CustomException customException = null;
if (exception instanceof CustomException) {
customException = (CustomException) exception;
} else {
// 如果抛出的不是系统自定义异常则重新构造一个未知错误异常。
customException = new CustomException("未知错误,请与系统管理 员联系!");
}
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("message", customException.getMessage());
modelAndView.setViewName("error");
return modelAndView;
} else {
// 如果是ajax请求,JSON格式返回
try {
response.setContentType("application/json;charset=UTF-8");
PrintWriter writer = response.getWriter();
JSONObject json=new JSONObject();
json.put("success", false);
// 为安全起见,只有业务异常我们对前端可见,否则统一归为系统异常
if (exception instanceof CustomException) {
json.put("msg", exception.getMessage());
} else {
//未知错误
json.put("msg", "系统异常!");
}
writer.write(json.toString());
writer.flush();
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return null;
}
}
- 最后,在spring-mvc.xml配置中声明异常处理器对象
<!-- 异常处理器 -->
<bean class="com.koi.exception.CustomExceptionResolver" />