在项目中如何处理出现的异常,在每一个可能出现异常的地方都写代码捕捉异常?这显然是不合理的,当项目愈来愈大是也是不可维护的。那么如何保证咱们处理异常的代码精简且便于维护呢?这就是本篇要讲的内容—>异常处理。html
在Spring MVC中咱们能够经过如下2中途径来对异常进行集中处理:java
一.继承HandlerExceptionResolver接口实现本身的处理方法,如:web
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"); } }
而后在项目的配置文件中添加:spring
<bean id="exceptionResolver" class="所在包名.MyHandlerExceptionResolver"/>
这样就完成了异常的捕捉和处理。sql
二.咱们介绍了第一种捕捉处理异常方式,可是第一种方式须要在配置文件中进行配置,有的时候咱们会以为配置文件内容太多太乱,那么咱们就能够借助@ExceptionHandler注解来实现零配置的异常捕捉和处理。数据库
首先,在咱们项目的包com.demo.web.controllers中为controller创建一个父类BaseController,内容以下:app
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以便进行测试:eclipse
public class HelloWorldController extends BaseController{ //...内容省略 }
而后,修改HelloWorldController 中的index方法,使其抛出异常,看能不能正常捕捉:jsp
//@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视图来显示错误信息:ide
<%@ 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就能实现异常的集中捕捉和处理了。
代码下载:http://pan.baidu.com/s/1c0eTseG
注: 以前没注意前11篇的示例代码,不知道为何当时打包上传上去的是没有.project项目文件的,致使下载后不能直接导入eclipse运行,虚拟机又 被我删掉了,这些示例代码也没有备份,可是代码文件还在的,因此能够新建一个Dynamic Web Project把对应的配置文件和controller还有view导入就能够了,给你们形成的不便说声抱歉。