SpringMVC-异常处理器
阅读原文时间:2023年07月11日阅读:2

1.    异常处理思路

系统中异常包括两类:预期异常和运行时异常RuntimeException,前者通过捕获异常从而获取异常信息,后者主要通过规范代码开发、测试通过手段减少运行时异常的发生。

系统的dao、service、controller出现都通过throws Exception向上抛出,最后由springmvc前端控制器交由异常处理器进行异常处理,如下图:

2.    自定义异常类

为了区别不同的异常通常根据异常类型自定义异常类,这里我们创建一个自定义系统异常,如果controller、service、dao抛出此类异常说明是系统预期处理的异常信息。

public class CustomException extends Exception {

/** serialVersionUID*/

private static final long serialVersionUID = -5212079010855161498L;

public CustomException(String message){

super(message);

this.message = message;

}

//异常信息

private String message;

public String getMessage() {

return message;

}

public void setMessage(String message) {

this.message = message;

}

}

3.    自定义异常处理器

public class CustomExceptionResolver implements HandlerExceptionResolver {

@Override

public ModelAndView resolveException(HttpServletRequest request,

HttpServletResponse response, Object handler, Exception ex) {

ex.printStackTrace();

CustomException customException = null;

//如果抛出的是系统自定义异常则直接转换

if(ex instanceof CustomException){

customException = (CustomException)ex;

}else{

//如果抛出的不是系统自定义异常则重新构造一个系统错误异常。

customException = new CustomException("系统错误,请与系统管理 员联系!");

}

ModelAndView modelAndView = new ModelAndView();

modelAndView.addObject("message", customException.getMessage());

modelAndView.setViewName("error");

return modelAndView;

}

}

取异常堆栈:

try {

} catch (Exception e) {

StringWriter s = new StringWriter();

PrintWriter printWriter = new PrintWriter(s);

e.printStackTrace(printWriter);

s.toString();

}

4.    错误页面

<%@ page language=_"java"_ contentType=_"text/html; charset=UTF-8"_ pageEncoding=_"UTF-8"_%> <%@ taglib uri=_"http://java.sun.com/jsp/jstl/core"_ prefix=_"c"_ %> <%@ taglib uri=_"http://java.sun.com/jsp/jstl/fmt"_  prefix=_"fmt"_%>

错误页面

您的操作出现错误如下:

${message }

5.    异常处理器配置

在springmvc.xml中添加:

6.    异常测试

修改商品信息,id输入错误提示商品信息不存在。

修改controller方法“editItem”,调用service查询商品信息,如果商品信息为空则抛出异常:

// 调用service查询商品信息

Items item = itemService.findItemById(id);

if(item == null){

throw new CustomException("商品信息不存在!");

}

在service中抛出异常方法同上。