1 异常处理器简介
系统中异常包括两类:预期异常和运行时异常RuntimeException,前者通过捕获异常从而获取异常信息,后者主要通过规范代码开发、测试通过手段减少运行时异常的发生。
springmvc在处理请求过程中出现异常信息交由异常处理器进行处理,自定义异常处理器可以实现一个系统的异常处理逻辑,比如处理所有没有处理过的运行时异常用于更友好地提示用户
系统的dao、service、controller出现都通过throws Exception向上抛出,最后由springmvc前端控制器交由异常处理器进行异常处理,大致如下图所示:
2 异常处理器入门
2.1 自定义异常类
为了区别不同的异常,通常根据异常类型进行区分,这里我们创建一个自定义系统异常。如果controller、service、dao抛出此类异常说明是系统预期处理的异常信息。
package com.itykd.exception;
public class MyException extends Exception{
//异常信息
private String message;
public MyException() {
super();
}
public MyException(String message) {
super();
this.message = message;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
2.2 自定义异常处理器
package com.itykd.exception;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.io.Writer;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;
public class CustomHandleException implements HandlerExceptionResolver{
@Override
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object obj,
Exception exception) {
//定义异常信息
String msg;
//判断异常类型
if(exception instanceof MyException) {
//如果是自定义异常
msg=exception.getMessage();
}else {
//如果是运行时异常,则取错误堆栈,从堆栈中取数据
Writer writer = new StringWriter();
PrintWriter printWriter = new PrintWriter(writer);
exception.printStackTrace(printWriter);
msg=writer.toString();
}
//返回错误页面
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("msg",msg);
modelAndView.setViewName("error");
return modelAndView;
}
}
2.3 异常处理器的配置
在springmvc.xml中配置如下:
<!-- 配置全局异常处理器 -->
<bean id="customHandleException" class="com.itykd.exception.CustomHandleException"/>
2.4 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>
<h2>系统发生异常!</h2><br/>
<h4>异常信息</h4><br/>
<h5>${msg }</h5>
</body>
</html>
2.5 测试
@RequestMapping(value="/itemList.action")
public ModelAndView queryItemList() throws MyException {
if(true) {
//抛出自定义异常
throw new MyException("自定义异常出现了!");
}
//运行时异常
int a = 1/0;
//查询商品数据
List<Items> itemsList = itemsService.queryItemsList();
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("itemList",itemsList);
return modelAndView;
}