本节内容:
- 异常处理思路
- 自定义异常类
- 自定义异常处理器
- 异常处理器配置
- 错误页面
- 异常测试
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;
}