SpringMVC异常处理
在项目中怎样处理出现的异常,在每一个可能出现异常的地方都写代码捕捉异常?这显然是不合理的,当项目越来越大是也是不可维护的。那么怎样保证我们处理异常的代码精简且便于维护呢?这就是本篇要讲的内容—>异常处理。
在Spring MVC中我们能够通过下面2中途径来对异常进行集中处理:
一.继承HandlerExceptionResolver接口实现自己的处理方法,如:
public class MyHandlerExceptionResolver implements HandlerExceptionResolver { @Override public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) { //加入自己的异常处理逻辑,如日志记录等 // TODO Auto-generated method stub return new ModelAndView("exception"); } }
然后在项目的配置文件里加入:
<bean id="exceptionResolver" class="所在包名.MyHandlerExceptionResolver"/>
这样就完毕了异常的捕捉和处理。
二.我们介绍了第一种捕捉处理异常方式,可是第一种方式须要在配置文件里进行配置,有的时候我们会认为配置文件内容太多太乱。那么我们就能够借助@ExceptionHandler注解来实现零配置的异常捕捉和处理。
首先,在我们项目的包com.demo.web.controllers中为controller建立一个父类BaseController。内容例如以下:
package com.demo.web.controllers; import java.sql.SQLException; import javax.servlet.http.HttpServletRequest; import org.springframework.web.bind.annotation.ExceptionHandler; public abstract class BaseController { @ExceptionHandler public String exception(HttpServletRequest request, Exception e) { //加入自己的异常处理逻辑,如日志记录 request.setAttribute("exceptionMessage", e.getMessage()); // 依据不同的异常类型进行不同处理 if(e instanceof SQLException) return "testerror"; else return "error"; } }
其次,改动项目中HelloWorldController让它继承于BaseController以便进行測试:
public class HelloWorldController extends BaseController{ //...内容省略 }
然后,改动HelloWorldController 中的index方法,使其抛出异常,看能不能正常捕捉:
//@AuthPassport @RequestMapping(value={"/index","/hello"}) public ModelAndView index() throws SQLException{ throw new SQLException("数据库异常。"); /*ModelAndView modelAndView = new ModelAndView(); modelAndView.addObject("message", "Hello World!"); modelAndView.setViewName("index"); return modelAndView;*/ }
最后,在views目录中加入testerror.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>error!</title> </head> <body> ${exceptionMessage} </body> </html>
执行项目:
能够看到异常已经被捕捉并显示,这样仅仅要把我们的其他的Controller所有继承于BaseController就能实现异常的集中捕捉和处理了。
在项目中怎样处理出现的异常,在每一个可能出现异常的地方都写代码捕捉异常?这显然是不合理的,当项目越来越大是也是不可维护的。那么怎样保证我们处理异常的代码精简且便于维护呢?这就是本篇要讲的内容—>异常处理。
在Spring MVC中我们能够通过下面2中途径来对异常进行集中处理:
一.继承HandlerExceptionResolver接口实现自己的处理方法,如:
public class MyHandlerExceptionResolver implements HandlerExceptionResolver { @Override public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) { //加入自己的异常处理逻辑,如日志记录等 // TODO Auto-generated method stub return new ModelAndView("exception"); } }
然后在项目的配置文件里加入:
<bean id="exceptionResolver" class="所在包名.MyHandlerExceptionResolver"/>
这样就完毕了异常的捕捉和处理。
二.我们介绍了第一种捕捉处理异常方式,可是第一种方式须要在配置文件里进行配置,有的时候我们会认为配置文件内容太多太乱。那么我们就能够借助@ExceptionHandler注解来实现零配置的异常捕捉和处理。
首先,在我们项目的包com.demo.web.controllers中为controller建立一个父类BaseController。内容例如以下:
package com.demo.web.controllers; import java.sql.SQLException; import javax.servlet.http.HttpServletRequest; import org.springframework.web.bind.annotation.ExceptionHandler; public abstract class BaseController { @ExceptionHandler public String exception(HttpServletRequest request, Exception e) { //加入自己的异常处理逻辑,如日志记录 request.setAttribute("exceptionMessage", e.getMessage()); // 依据不同的异常类型进行不同处理 if(e instanceof SQLException) return "testerror"; else return "error"; } }
其次,改动项目中HelloWorldController让它继承于BaseController以便进行測试:
public class HelloWorldController extends BaseController{ //...内容省略 }
然后,改动HelloWorldController 中的index方法,使其抛出异常,看能不能正常捕捉:
//@AuthPassport @RequestMapping(value={"/index","/hello"}) public ModelAndView index() throws SQLException{ throw new SQLException("数据库异常。"); /*ModelAndView modelAndView = new ModelAndView(); modelAndView.addObject("message", "Hello World!"); modelAndView.setViewName("index"); return modelAndView;*/ }
最后,在views目录中加入testerror.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>error!</title> </head> <body> ${exceptionMessage} </body> </html>
执行项目:
能够看到异常已经被捕捉并显示,这样仅仅要把我们的其他的Controller所有继承于BaseController就能实现异常的集中捕捉和处理了。
来源:https://www.cnblogs.com/liguangsunls/p/7254004.html