springmvc 异常处理
springmvc在处理请求过程中出现异常信息交由异常处理器进行处理,自定义异常处理器可以实现一个系统的异常处理逻辑。
系统中异常包括两类:预期异常和运行时异常RuntimeException,前者通过捕获异常从而获取异常信息,后者主要通过规范代码开发、测试通过手段减少运行时异常的发生。
系统的dao、service、controller出现都通过throws Exception向上抛出,最后由springmvc前端控制器交由异常处理器进行异常处理,如下图:
自定义异常类
为了区别不同的异常,通常根据异常类型进行区分,这里我们创建一个自定义系统异常。
如果controller、service、dao抛出此类异常说明是系统预期处理的异常信息。
public class MyException extends Exception{ private String message; public MyException() { super(); // TODO Auto-generated constructor stub } public MyException(String message) { super(); this.message = message; } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } }
自定义异常处理器
public class CustomHandleException implements HandlerExceptionResolver{ public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object object, Exception exception) { String msg; //判断异常类型 if(exception instanceof MyException) { // 如果是自定义异常,读取异常信息 msg = exception.getMessage(); }else { // 如果是运行时异常,则取错误堆栈,从堆栈中获取异常信息 Writer out = new StringWriter(); PrintWriter pw = new PrintWriter(out); exception.printStackTrace(pw); msg = out.toString(); }
//返回错误的页面 ModelAndView modelAndView = new ModelAndView(); modelAndView.addObject("msg", msg); modelAndView.setViewName("error"); return modelAndView; } }
配置异常处理器
<!-- 配置全局异常处理器 --> <bean id="customHandleException" class="com.exception.CustomHandleException"></bean>
错误页面
<%@ 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>
测试方法
@RequestMapping(value="exception") public ModelAndView exception() throws Exception{ // 自定义异常 if (true) { throw new MyException("自定义异常出现了~"); } ModelAndView mav = new ModelAndView(); mav.setViewName("error"); return mav; }