Spring MVC中的统一异常处理

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)自定义异常处理器

全局异常处理器处理思路:
解析出异常类型。

  1. 如果该异常类型是系统自定义的异常,直接取出异常信息,在错误页面展示。
  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";
}

在这里插入图片描述

可以看出在自定义的异常处理器中能获取导致出现异常的对象,有利于提供更详细的异常处理信息。一般用这种自定义的全局异常处理器比较多。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

robona

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值