一棉姐、異常處理器
?springmvc 在處理請(qǐng)求過(guò)程中出現(xiàn)異常信息交由異常處理器進(jìn)行處理妄均,自定義異常處理器可以實(shí)現(xiàn)一個(gè)系統(tǒng)的異常處理邏輯。
異常處理思路:
??系統(tǒng)中異常包括兩類:預(yù)期異常和運(yùn)行時(shí)異常 RuntimeException,前者通過(guò)捕獲異常從而獲取異常信息,后者主要通過(guò)規(guī)范代碼開(kāi)發(fā)翰绊、測(cè)試通過(guò)手段減少運(yùn)行時(shí)異常的發(fā)生。
??系統(tǒng)的 dao旁壮、service监嗜、controller 出現(xiàn)都通過(guò) throws Exception 向上拋出,最后由springmvc 前端控制器交由異常處理器進(jìn)行異常處理抡谐,如下圖:
異常處理思路
二裁奇、自定義異常
??為了區(qū)別不同的異常,通常根據(jù)異常類型我們會(huì)自定義異常類麦撵,這里我們創(chuàng)建一個(gè)自定義
系統(tǒng)異常類刽肠,如果 controller、service厦坛、dao 拋出此類異常說(shuō)明是系統(tǒng)預(yù)期處理的異常信息五垮。
@Data
public class CustomException extends Exception{
private static final long serialVersionUID = 1L;
public CustomException(String message){
super(message);
this.message = message;
}
//異常信息
private String message;
}
三乍惊、自定義異常處理器
public class CustomExceptionResolver implements HandlerExceptionResolver {
@Override
public ModelAndView resolveException(HttpServletRequest
request, HttpServletResponse response, Object handler,
Exception ex) {
ex.printStackTrace();
CustomException customException = null;
// 如果拋出的是系統(tǒng)自定義異常則直接轉(zhuǎn)換
if (ex instanceof CustomException) {
customException = (CustomException) ex;
} else {
// 如果拋出的不是系統(tǒng)自定義異常則重新構(gòu)造一個(gè)未知錯(cuò)誤異常杜秸。
customException = new CustomException("未知錯(cuò)誤,請(qǐng)與系統(tǒng)管
理 員聯(lián)系润绎!");
}
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("message",
customException.getMessage());
modelAndView.setViewName("error");
return modelAndView;
}
}
四撬碟、錯(cuò)誤頁(yè)面
<%@ 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 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=UTF8">
<title>錯(cuò)誤頁(yè)面</title>
</head>
<body>
您的操作出現(xiàn)錯(cuò)誤如下:
<br /> ${message}
</body>
</html>
五、異常處理器配置(springmvc.xml)
<!-- 異常處理器 -->
<bean id="handlerExceptionResolver"
class="com.neuedu.exception.CustomExceptionResolver" />
也可直接在類上加注解
@Component(value = "handlerExceptionResolver")
就無(wú)需在xml中配置了莉撇。
六呢蛤、錯(cuò)誤測(cè)試
修改商品信息,id 輸入錯(cuò)誤提示商品信息不存在棍郎。
修改 controller 方法“editItem”其障,調(diào)用 service 查詢商品信息,如果商品信息為空則拋
出異常:
// 調(diào)用 service 查詢商品信息
Items item = itemsServiceImpl.findByItems(id);
if(item == null){
throw new CustomException("商品信息不存在!");
}
在 service 中拋出異常方法同上涂佃。