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;
	}
原文地址:https://www.cnblogs.com/zhaojiankai/p/8184526.html