1 異常處理
1.1 異常處理思路
系統中異常包括兩類:預期異常和運行時異常RuntimeException,前者通過捕獲異常從而獲取異常信息,後者主要通過規範代碼開發、測試通過手段減少運行時異常的發生。
系統的dao、service、controller出現都通過throwsException向上拋出,最後由springmvc前端控制器交由異常處理器進行異常處理,如下圖:
1.2 自定義異常類
對不同的異常類型定義異常類,繼承Exception。
爲了區別不同的異常通常根據異常類型自定義異常類,這裏我們創建一個自定義系統異常,如果controller、service、dao拋出此類異常說明是系統預期處理的異常信息。
public class CustomException extends Exception {
/** serialVersionUID*/
private static final long serialVersionUID = -5212079010855161498L;
public CustomException(String message){
super(message);
this.message = message;
}
//異常信息
private String message;
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
1.3自定義異常處理器
思路:
系統遇到異常,在程序中手動拋出,dao拋給service、service給controller、controller拋給前端控制器,前端控制器調用全局異常處理器。
全局異常處理器處理思路:
解析出異常類型
如果該 異常類型是系統 自定義的異常,直接取出異常信息,在錯誤頁面展示
如果該 異常類型不是系統 自定義的異常,構造一個自定義的異常類型(信息爲“未知錯誤”)
springmvc提供一個HandlerExceptionResolver接口
public class CustomExceptionResolver implementsHandlerExceptionResolver {
@Override
public ModelAndView resolveException(HttpServletRequestrequest,
HttpServletResponse response, Object handler, Exceptionex) {
ex.printStackTrace();
CustomException customException = null;
//如果拋出的是系統自定義異常則直接轉換
if(ex instanceof CustomException){
customException = (CustomException)ex;
}else{
//如果拋出的不是系統自定義異常則重新構造一個未知錯誤異常。
customException = new CustomException("未知錯誤,請與系統管理員聯繫!");
}
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("message", customException.getMessage());
modelAndView.setViewName("error");
return modelAndView;
}
}
1.4錯誤頁面
<%@ page language="java"contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core"prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
<!DOCTYPE htmlPUBLIC "-//W3C//DTDHTML 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>錯誤頁面</title>
</head>
<body>
您的操作出現錯誤如下:<br/>
${message }
</body>
</html>
1.5 異常處理器配置
在springmvc.xml中添加:
<!-- 異常處理器 -->
<bean id="handlerExceptionResolver"class="cn.itcast.ssm.controller.exceptionResolver.CustomExceptionResolver"/>
1.6 異常測試
在controller、service、dao中任意一處需要手動拋出異常。
如果是程序中手動拋出的異常,在錯誤頁面中顯示自定義的異常信息,如果不是手動拋出異常說明是一個運行時異常,在錯誤頁面只顯示“未知錯誤”。
在商品修改的controller方法中拋出異常 .
在service接口中拋出異常:
如果與業務功能相關的異常,建議在service中拋出異常。
與業務功能沒有關係的異常,建議在controller中拋出。
上邊的功能,建議在service中拋出異常。