SpringMVC學習系列(10) 之 異常處理

在項目中如何處理出現的異常,在每一個可能出現異常的地方都寫代碼捕捉異常?這顯然是不合理的,當項目愈來愈大是也是不可維護的。那麼如何保證咱們處理異常的代碼精簡且便於維護呢?這就是本篇要講的內容—>異常處理。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>

運行項目:

1

能夠看到異常已經被捕捉並顯示,這樣只要把咱們的其它的Controller所有繼承於BaseController就能實現異常的集中捕捉和處理了。

 

代碼下載:http://pan.baidu.com/s/1c0eTseG

 

注: 以前沒注意前11篇的示例代碼,不知道爲何當時打包上傳上去的是沒有.project項目文件的,致使下載後不能直接導入eclipse運行,虛擬機又 被我刪掉了,這些示例代碼也沒有備份,可是代碼文件還在的,因此能夠新建一個Dynamic Web Project把對應的配置文件和controller還有view導入就能夠了,給你們形成的不便說聲抱歉。

相關文章
相關標籤/搜索