在項目中如何處理出現的異常,在每個可能出現異常的地方都寫代碼捕捉異常?這顯然是不合理的,當項目越來越大是也是不可維護的。那么如何保證我們處理異常的代碼精簡且便於維護呢?這就是本篇要講的內容—>異常處理。
在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就能實現異常的集中捕捉和處理了。
代碼下載:http://pan.baidu.com/s/1c0eTseG
注: 之前沒注意前11篇的示例代碼,不知道為什么當時打包上傳上去的是沒有.project項目文件的,導致下載后不能直接導入eclipse運行,虛擬機又 被我刪掉了,這些示例代碼也沒有備份,但是代碼文件還在的,所以可以新建一個Dynamic Web Project把對應的配置文件和controller還有view導入就可以了,給大家造成的不便說聲抱歉。