SpringMVC异常处理器
本节内容:
- 异常处理思路
- 自定义异常类
- 自定义异常处理器
- 异常处理器配置
- 错误页面
- 异常测试
springmvc在处理请求过程中出现异常信息交由异常处理器进行处理,自定义异常处理器可以实现一个系统的异常处理逻辑。(它负责捕获,将异常放到我们自己编写的处理类中)
一、异常处理器思路
系统中异常包括两类:预期异常和运行时异常RuntimeException,前者通过捕获异常从而获取异常信息,后者主要通过规范代码开发、测试通过手段减少运行时异常的发生。
系统的dao、service、controller出现都通过throws Exception向上抛出,最后由springmvc前端控制器交由异常处理器进行异常处理,如下图:
二、自定义异常类
为了区别不同的异常,通常根据异常类型进行区分,这里我们创建一个自定义系统异常。
如果controller、service、dao抛出此类异常说明是系统预期处理的异常信息。
【示例】:MyException.java
package com.wisedu.springmvc.exception; public class MyException extends Exception{ private String msg; public MyException() { super(); } public MyException(String msg) { super(); this.msg = msg; } public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } }
三、自定义异常处理器
CustomExceptionResolver.java
package com.wisedu.springmvc.exception; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.HandlerExceptionResolver; import org.springframework.web.servlet.ModelAndView; import java.io.PrintWriter; import java.io.StringWriter; import java.io.Writer; /** * 异常处理器的自定义的实现类 * @author jkzhao * */ public class CustomHandleException implements HandlerExceptionResolver{ public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object obj, // obj是发生异常的地方。比如异常发生在 Serivce层的某个方法,obj是 包名+类名+方法名(形参)拼起来的一个字符串 Exception e) { //记录日志 //... // 定义异常信息 String msg; //判断异常类型 if(e instanceof MyException){ //预期异常 msg = ((MyException) e).getMsg(); }else{ // 如果是运行时异常,则取错误堆栈,从堆栈中获取异常信息 Writer out = new StringWriter(); PrintWriter s = new PrintWriter(out); e.printStackTrace(s); msg = out.toString(); } // 返回错误页面,给用户友好页面显示错误信息 ModelAndView mav = new ModelAndView(); mav.addObject("msg", msg); mav.setViewName("error"); return mav; } }
完整的写法,包含了预期异常和运行时异常。
四、异常处理器配置
在springmvc.xml中添加:
<!-- 异常处理器 --> <bean id="customHandleException" class="com.wisedu.springmvc.exception.CustomHandleException"></bean>
五、错误页面
error.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <h1>系统发生异常了!</h1> <br /> <h1>异常信息</h1> <br /> <h2>${msg }</h2> </body> </html>
六、异常测试
修改ItemController方法“itemList”,抛出异常:
@RequestMapping(value = "/item/itemlist.action") public ModelAndView itemList() throws MyException { // 从MySQL中查询数据 List<Items> list = itemService.selectItemsList(); //运行时异常 int i = 1/0; //自定义异常 if (true){ throw new MyException("商品信息不能为空"); } // 创建ModelAndView,用来存放数据和视图 ModelAndView mav = new ModelAndView(); // 设置数据到模型中 mav.addObject("itemList", list); //页面上循环的是itemList // 设置视图的路径,需要设置视图的物理地址 //mav.setViewName("/WEB-INF/jsp/itemList.jsp"); mav.setViewName("itemList"); //在springmvc.xml中替换掉默认的视图解析器 return mav; }