SpringMVC整合SSM實(shí)現(xiàn)異常處理器詳解
異常處理器
程序開發(fā)過程中不可避免的會遇到異?,F(xiàn)象

出現(xiàn)異常現(xiàn)象的常見位置與常見誘因如下:
- 框架內(nèi)部拋出的異常:因使用不合規(guī)導(dǎo)致
- 數(shù)據(jù)層拋出的異常:因外部服務(wù)器故障導(dǎo)致(例如:服務(wù)器訪問超時(shí))
- 業(yè)務(wù)層拋出的異常:因業(yè)務(wù)邏輯書寫錯(cuò)誤導(dǎo)致(例如:遍歷業(yè)務(wù)書寫操作,導(dǎo)致索引異常等)
- 表現(xiàn)層拋出的異常:因數(shù)據(jù)收集、校驗(yàn)等規(guī)則導(dǎo)致(例如:不匹配的數(shù)據(jù)類型間導(dǎo)致異常)
- 工具類拋出的異常:因工具類書寫不嚴(yán)謹(jǐn)不夠健壯導(dǎo)致(例如:必要釋放的連接長期未釋放等)
所有的異常均拋出到表現(xiàn)層進(jìn)行處理
表現(xiàn)層處理異常,每個(gè)方法中單獨(dú)書寫,代碼書寫量巨大且意義不強(qiáng),使用AOP思想統(tǒng)一處理
編寫異常處理器、集中的、統(tǒng)一的處理項(xiàng)目中出現(xiàn)的異常
@RestControllerAdvice //用于標(biāo)識當(dāng)前類為REST風(fēng)格對應(yīng)的異常處理器
public class ProjectExceptionAdvice {
//統(tǒng)一處理所有的Exception異常
@ExceptionHandler(Exception.class)
public Result doOtherException(Exception ex){
return new Result(500,null,"系統(tǒng)異常");
}
}
使用異常處理器之后的效果
@RestControllerAdvice注解介紹
- 名稱:@RestControllerAdvice
- 類型:==類注解==
- 位置:Rest風(fēng)格開發(fā)的控制器增強(qiáng)類定義上方
- 作用:為Rest風(fēng)格開發(fā)的控制器類做增強(qiáng)
- 說明:此注解自帶@ResponseBody注解與@Component注解,具備對應(yīng)的功能
@ExceptionHandler注解介紹
- 名稱:@ExceptionHandler
- 類型:==方法注解==
- 位置:專用于異常處理的控制器方法上方
- 作用:設(shè)置指定異常的處理方案,功能等同于控制器方法,出現(xiàn)異常后終止原始控制器執(zhí)行,并轉(zhuǎn)入當(dāng)前方法執(zhí)行
- 說明:此類方法可以根據(jù)處理的異常不同,制作多個(gè)方法分別處理對應(yīng)的異常
項(xiàng)目異常處理方案
項(xiàng)目異常分類
業(yè)務(wù)異常(BusinessException)
- 規(guī)范的用戶行為產(chǎn)生的異常
- 不規(guī)范的用戶行為操作產(chǎn)生的異常
系統(tǒng)異常(SystemException)
- 項(xiàng)目運(yùn)行過程中可預(yù)計(jì)且無法避免的異常
其他異常(Exception)
- 編程人員未預(yù)期到的異常
項(xiàng)目異常處理方案
- 業(yè)務(wù)異常(BusinessException)
- 發(fā)送對應(yīng)消息傳遞給用戶,提醒規(guī)范操作
系統(tǒng)異常(SystemException)
- 發(fā)送固定消息傳遞給用戶,安撫用戶
- 發(fā)送特定消息給運(yùn)維人員,提醒維護(hù)
- 記錄日志
其他異常(Exception)
- 發(fā)送固定消息傳遞給用戶,安撫用戶
- 發(fā)送特定消息給編程人員,提醒維護(hù)(納入預(yù)期范圍內(nèi))
- 記錄日志
項(xiàng)目異常處理代碼實(shí)現(xiàn)
根據(jù)異常分類自定義異常類
自定義項(xiàng)目系統(tǒng)級異常
//自定義異常處理器,用于封裝異常信息,對異常進(jìn)行分類
public class SystemException extends RuntimeException{
private Integer code;
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public SystemException(Integer code, String message) {
super(message);
this.code = code;
}
public SystemException(Integer code, String message, Throwable cause) {
super(message, cause);
this.code = code;
}
}自定義項(xiàng)目業(yè)務(wù)級異常
//自定義異常處理器,用于封裝異常信息,對異常進(jìn)行分類
public class BusinessException extends RuntimeException{
private Integer code;
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public BusinessException(Integer code, String message) {
super(message);
this.code = code;
}
public BusinessException(Integer code,String message,Throwable cause) {
super(message, cause);
this.code = code;
}
}自定義異常編碼(持續(xù)補(bǔ)充)
public class Code {
//狀態(tài)碼
public static final Integer SAVE_OK = 20011;
public static final Integer DELETE_OK = 20021;
public static final Integer UPDATE_OK = 20031;
public static final Integer GET_OK = 20041;
public static final Integer SAVE_ERR = 20010;
public static final Integer DELETE_ERR = 20020;
public static final Integer UPDATE_ERR = 20030;
public static final Integer GET_ERR = 20040;
public static final Integer SYSTEM_ERR = 50001;
public static final Integer SYSTEM_TIMEOUT_ERR = 50002;
public static final Integer SYSTEM_UNKNOW_ERR = 59999;
public static final Integer BUSINESS_ERR = 60002;
}觸發(fā)自定義異常
@Service
public class BookServiceImpl implements BookService {
@Autowired
private BookDao bookDao;
//在getById演示觸發(fā)異常,其他方法省略沒有寫進(jìn)來
public Book getById(Integer id) {
//模擬業(yè)務(wù)異常,包裝成自定義異常
if(id <0){
throw new BusinessException(Code.BUSINESS_ERR,"項(xiàng)目業(yè)務(wù)級異常!");
}
}
}??在異常通知類中攔截并處理異常
@RestControllerAdvice //用于標(biāo)識當(dāng)前類為REST風(fēng)格對應(yīng)的異常處理器
public class ProjectExceptionAdvice {
//@ExceptionHandler用于設(shè)置當(dāng)前處理器類對應(yīng)的異常類型
@ExceptionHandler(SystemException.class)
public Result doSystemException(SystemException ex){
//記錄日志
//發(fā)送消息給運(yùn)維
//發(fā)送郵件給開發(fā)人員,ex對象發(fā)送給開發(fā)人員
return new Result(ex.getCode(),null,ex.getMessage());
}
@ExceptionHandler(BusinessException.class)
public Result doBusinessException(BusinessException ex){
return new Result(ex.getCode(),null,ex.getMessage());
}
//除了自定義的異常處理器,保留對Exception類型的異常處理,用于處理非預(yù)期的異常
@ExceptionHandler(Exception.class)
public Result doOtherException(Exception ex){
//記錄日志
//發(fā)送消息給運(yùn)維
//發(fā)送郵件給開發(fā)人員,ex對象發(fā)送給開發(fā)人員
return new Result(Code.SYSTEM_UNKNOW_ERR,null,"系統(tǒng)繁忙,請稍后再試!");
}
}測試:在postman中發(fā)送請求訪問getById方法,傳遞參數(shù)-1,得到以下結(jié)果:

到此這篇關(guān)于SpringMVC整合SSM實(shí)現(xiàn)異常處理器詳解的文章就介紹到這了,更多相關(guān)SpringMVC整合SSM內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring項(xiàng)目運(yùn)行依賴spring-contex解析
這篇文章主要介紹了Spring項(xiàng)目運(yùn)行依賴spring-contex解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05
10張圖總結(jié)出并發(fā)編程最佳學(xué)習(xí)路線
這篇文章主要介紹了并發(fā)編程的最佳學(xué)習(xí)路線,文中通過圖片介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-08-08
Spring?Data?Jpa?復(fù)雜查詢方式總結(jié)(多表關(guān)聯(lián)及自定義分頁)
這篇文章主要介紹了Spring?Data?Jpa?復(fù)雜查詢方式總結(jié)(多表關(guān)聯(lián)及自定義分頁),具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02
Java?Collections.sort()實(shí)現(xiàn)List排序的默認(rèn)方法和自定義方法
這篇文章主要介紹了Java?Collections.sort()實(shí)現(xiàn)List排序的默認(rèn)方法和自定義方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2017-06-06
Java后綴數(shù)組之求sa數(shù)組的實(shí)例代碼
后綴數(shù)組就是一個(gè)字符串所有后綴大小排序后的一個(gè)集合,然后我們根據(jù)后綴數(shù)組的一些性質(zhì)就可以實(shí)現(xiàn)各種需求。這篇文章主要介紹了Java后綴數(shù)組-求sa數(shù)組,需要的朋友可以參考下2018-04-04

