Springm MVC中的統一異常處理
阿新 • • 發佈:2018-12-22
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)自定義異常處理器
全域性異常處理器處理思路:
解析出異常型別。
- 如果該異常型別是系統自定義的異常,直接取出異常資訊,在錯誤頁面展示。
- 如果該異常型別不是系統自定義的異常,那麼應取出錯誤的堆疊資訊,並記錄下來,在錯誤頁面展示。
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";
}
可以看出在自定義的異常處理器中能獲取導致出現異常的物件,有利於提供更詳細的異常處理資訊。一般用這種自定義的全域性異常處理器比較多。