1. 程式人生 > >Springm MVC中的統一異常處理

Springm MVC中的統一異常處理

SpringMVC在處理請求過程中出現異常資訊交由異常處理器進行處理,自定義異常處理器可以實現一個系統的異常處理邏輯。

本節案例是在上一節案例的基礎上做的。

異常處理思路

系統的dao、service、controller出現異常都通過throws Exception向上丟擲,最後由SpringMVC前端控制器交由異常處理器進行異常處理,SpringMVC提供全域性異常處理器(一個系統只有一個異常處理器)進行統一異常處理。如圖:
在這裡插入圖片描述

案例–配置Spring mvc全域性異常處理

1)自定義異常類

為了區別不同的異常通常根據異常型別自定義異常類,這裡我們建立一個自定義系統異常,如果controller、service、dao丟擲此類異常說明是系統預期處理的異常資訊。
在com.oak.ssm.exception

public class CustomerException extends Exception{
	private String expMessage;

	public CustomerException(String expMessage) {
		super();
		this.expMessage = expMessage;
	}

	public CustomerException() {
		super();
	}

	public String getExpMessage() {
		return expMessage;
	}

	public void setExpMessage
(String expMessage) { this.expMessage = expMessage; } }

2)自定義異常處理器

全域性異常處理器處理思路:
解析出異常型別。

  1. 如果該異常型別是系統自定義的異常,直接取出異常資訊,在錯誤頁面展示。
  2. 如果該異常型別不是系統自定義的異常,那麼應取出錯誤的堆疊資訊,並記錄下來,在錯誤頁面展示。

SpringMVC提供一個HandlerExceptionResolver介面,自定義全域性異常處理器必須要實現這個介面,所以我們可在com.oak.ssm.exception中自定義一個全域性異常處理器:

public class GlobalException
implements HandlerExceptionResolver{ @Override public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception exception) { //判斷異常來寫 String msg=null; if(exception instanceof CustomerException){ //如果是自定義異常,就從異常裡面取出錯誤資訊 CustomerException custExp=(CustomerException) exception; msg=custExp.getExpMessage(); }else{ //如果執行時異常,則取出錯誤的堆疊資訊 exception.printStackTrace(); StringWriter sw=new StringWriter(); PrintWriter pw=new PrintWriter(sw); exception.printStackTrace(pw); msg=sw.toString(); } // 返回一個友好的錯誤頁面,並顯示錯誤訊息 ModelAndView modelAndView = new ModelAndView(); modelAndView.addObject("msg", msg); modelAndView.setViewName("error"); return modelAndView; } }

3)在/WEB-INF/jsp目錄下提供一個錯誤頁面—error.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!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>Insert title here</title>
</head>
<body>
    <h1>系統傳送異常了。。。。。。。。。。。。</h1>
    <br/>
    <h2>錯誤訊息為:</h2>
    <br/>
    ${msg }
</body>
</html>

4)異常處理配置

在spring-mvc中配置異常處理器:

<!-- 配置全域性異常處理器,且只能有一個 -->
<bean class="com.oak.ssm.exception.GlobalException"></bean>

5)測試:

在StudentController中定義方法add和delete分別進行自定義異常測試和非自定義異常測試,
測試自定義異常

@RequestMapping("/add")
public String add() throws CustomerException{
	if(true){
		throw new CustomerException("這是我們自定義的異常");
	}
	return "jsp/student_list";
}

在瀏覽器訪問測試:
在這裡插入圖片描述

測試非自定義異常:

@RequestMapping("/delete")
public String delete(){
	//觸發異常
	int num=1/0;
	return "jsp/student_list";
}

在這裡插入圖片描述

可以看出在自定義的異常處理器中能獲取導致出現異常的物件,有利於提供更詳細的異常處理資訊。一般用這種自定義的全域性異常處理器比較多。