1. 程式人生 > >SpringMVC學習系列(10) 之 異常處理

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

在專案中如何處理出現的異常,在每個可能出現異常的地方都寫程式碼捕捉異常?這顯然是不合理的,當專案越來越大是也是不可維護的。那麼如何保證我們處理異常的程式碼精簡且便於維護呢?這就是本篇要講的內容—>異常處理。

在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>

執行專案:

1

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

注: 之前沒注意前11篇的示例程式碼,不知道為什麼當時打包上傳上去的是沒有.project專案檔案的,導致下載後不能直接匯入eclipse執行,虛擬機器又 被我刪掉了,這些示例程式碼也沒有備份,但是程式碼檔案還在的,所以可以新建一個Dynamic Web Project把對應的配置檔案和controller還有view匯入就可以了,給大家造成的不便說聲抱歉。