SpringMVC在处理请求过程中出现异常信息交由异常处理器进行处理,自定义异常处理器可以实现一个系统的异常处理逻辑。
本节案例是在上一节案例的基础上做的。
异常处理思路
系统的dao、service、controller出现异常都通过throws Exception向上抛出,最后由SpringMVC前端控制器交由异常处理器进行异常处理,SpringMVC提供全局异常处理器(一个系统只有一个异常处理器)进行统一异常处理。如图:
案例–配置Spring mvc全局异常处理
1)自定义异常类
为了区别不同的异常通常根据异常类型自定义异常类,这里我们创建一个自定义系统异常,如果controller、service、dao抛出此类异常说明是系统预期处理的异常信息。
在com.oak.ssm.exception
public class CustomerException extends Exception{
private String expMessage;
public CustomerException(String expMessage) {
super();
this.expMessage = expMessage;
}
public CustomerException() {
super();
}
public String getExpMessage() {
return expMessage;
}
public void setExpMessage(String expMessage) {
this.expMessage = expMessage;
}
}
2)自定义异常处理器
全局异常处理器处理思路:
解析出异常类型。
- 如果该异常类型是系统自定义的异常,直接取出异常信息,在错误页面展示。
- 如果该异常类型不是系统自定义的异常,那么应取出错误的堆栈信息,并记录下来,在错误页面展示。
SpringMVC提供一个HandlerExceptionResolver接口,自定义全局异常处理器必须要实现这个接口,所以我们可在com.oak.ssm.exception中自定义一个全局异常处理器:
public class GlobalException implements HandlerExceptionResolver{
@Override
public ModelAndView resolveException(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception exception) {
//判断异常来写
String msg=null;
if(exception instanceof CustomerException){
//如果是自定义异常,就从异常里面取出错误信息
CustomerException custExp=(CustomerException) exception;
msg=custExp.getExpMessage();
}else{
//如果运行时异常,则取出错误的堆栈信息
exception.printStackTrace();
StringWriter sw=new StringWriter();
PrintWriter pw=new PrintWriter(sw);
exception.printStackTrace(pw);
msg=sw.toString();
}
// 返回一个友好的错误页面,并显示错误消息
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("msg", msg);
modelAndView.setViewName("error");
return modelAndView;
}
}
3)在/WEB-INF/jsp目录下提供一个错误页面—error.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!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/>
<h2>错误消息为:</h2>
<br/>
${msg }
</body>
</html>
4)异常处理配置
在spring-mvc中配置异常处理器:
<!-- 配置全局异常处理器,且只能有一个 -->
<bean class="com.oak.ssm.exception.GlobalException"></bean>
5)测试:
在StudentController中定义方法add和delete分别进行自定义异常测试和非自定义异常测试,
测试自定义异常
@RequestMapping("/add")
public String add() throws CustomerException{
if(true){
throw new CustomerException("这是我们自定义的异常");
}
return "jsp/student_list";
}
在浏览器访问测试:
测试非自定义异常:
@RequestMapping("/delete")
public String delete(){
//触发异常
int num=1/0;
return "jsp/student_list";
}
可以看出在自定义的异常处理器中能获取导致出现异常的对象,有利于提供更详细的异常处理信息。一般用这种自定义的全局异常处理器比较多。