可單例開發、典型的教科書式的mvc構架----springmvc----day02(二)
6.異常處理
6.1異常處理思路
系統中異常包括兩類:預期異常和執行時異常RuntimeException,前者通過捕獲異常從而獲取異常資訊,後者主要通過規範程式碼開發、測試通過手段減少執行時異常的傳送。
系統的dao、service、controller出現都通過throws Exception向上丟擲,最後由springmvc前端控制器交由異常處理器進行異常處理。
springmvc提供全域性異常處理器(一個系統只有一個異常處理器)進行統一異常處理。
6.2自定義異常類
對不同的異常型別定義異常類,繼承Exception。
public class CustomException extends Exception {
// 異常資訊
private String message;
public CustomException(String message) {
super();
this.message = message;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
6.3全域性異常處理器
思路:
系統遇到異常,在程式中手動丟擲,dao丟擲service、service給controller、controller拋給前端控制器,前端控制器呼叫全域性異常處理器。
全域性異常處理器處理思路:
解析出異常型別
如果該異常是系統自定義的異常,直接取出異常資訊,在錯誤頁面展示
如果該異常型別不是系統自定義的異常,構造一個自定義的異常型別(資訊為“未知錯誤”)
springmvc提供一個HandlerExceptionResolver介面
@Override
public ModelAndView resolveException(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex) {
//handler就是處理器介面卡要執行Handler物件(只有method)
// 解析出異常型別
// 如果該 異常型別是系統 自定義的異常,直接取出異常資訊,在錯誤頁面展示
// String message = null;
// if(ex instanceof CustomException){
// message = ((CustomException)ex).getMessage();
// }else{
//// 如果該 異常型別不是系統 自定義的異常,構造一個自定義的異常型別(資訊為“未知錯誤”)
// message="未知錯誤";
// }
//上邊程式碼變為
CustomException customException = null;
if(ex instanceof CustomException){
customException = (CustomException)ex;
}else{
customException = new CustomException("未知錯誤");
}
//錯誤資訊
String message = customException.getMessage();
ModelAndView modelAndView = new ModelAndView();
//將錯誤資訊傳到頁面
modelAndView.addObject("message", message);
//指向錯誤頁面
modelAndView.setViewName("error");
return modelAndView;
}
6.4錯誤頁面
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>錯誤提示</title>
</head>
<body>
<h1>${message }</h1>
</body>
</html>