1、springmvc在处理请求过程中出现异常信息交由异常处理器进行处理,自定义异常处理器可以实现一个系统的异常处理逻辑。
1.1. 异常处理思路
系统中异常包括两类:预期异常和运行时异常RuntimeException,前者通过捕获异常从而获取异常信息,后者主要通过规范代码开发、测试通过手段减少运行时异常的发生。
系统的dao、service、controller出现都通过throws Exception向上抛出,最后由springmvc前端控制器交由异常处理器进行异常处理,如下图:

如上图所示,系统的dao、service、controller出现异常都通过throws Exception向上抛出,最后由springmvc前端控制器交由异常处理器进行异常处理。springmvc提供全局异常处理器(一个系统只有一个异常处理器)进行统一异常处理。明白了springmvc中的异常处理机制,下面就开实现springmvc中的异常处理。
1.2. 自定义异常类
为了区别不同的异常,通常根据异常类型进行区分,这里我们创建一个自定义系统异常。
如果controller、service、dao抛出此类异常说明是系统预期处理的异常信息。
package com.gmw.exception; public class MyException extends Exception { private static final long serialVersionUID = 1L; public MyException() { super(); // TODO Auto-generated constructor stub } public MyException(String message) { super(message); } }
1.3. 自定义异常处理器
package com.gmw.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; /** * 定义SpringMVC统一异常处理器,实现接口HandlerExceptionResolver * @author admin * */ public class CustomHandleException implements HandlerExceptionResolver{ /** * 处理完异常后,返回ModelAndView * model就是给用户看到的异常信息 * view就是在哪个页面显示异常信息 */ @Override public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception exception) { //定义异常信息 String message = ""; //判断异常信息 if(exception instanceof MyException){ //如果是自定义异常,读取异常信息 message = exception.getMessage();//打印父类的 }else{ //如果是运行时异常,则取错误的的堆栈,从堆栈中获取异常信息 Writer out = new StringWriter(); PrintWriter pw = new PrintWriter(out); exception.printStackTrace(pw); message = out.toString(); } // 把错误信息发给相关人员,邮件,短信等方式 // 返回错误页面,给用户友好页面显示错误信息 ModelAndView modelAndView = new ModelAndView(); modelAndView.setViewName("error"); modelAndView.addObject("message", message); System.out.println("message --> " + message); return modelAndView; } }
1.4. 异常处理器配置
在springmvc.xml中添加:主要是扫描自定义异常处理器,也可以采用注解的方式 @Componet
<!-- 配置全局异常处理器 --> <bean id="customHandleException" class="com.gmw.exception.CustomHandleException" />
1.5. 错误页面
<%@page language="java"contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE htmlPUBLIC"-//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>${message}</h2> </body> </html>
浙公网安备 33010602011771号