springboot異常處理的基本規(guī)范
背景分析
在項目的開發(fā)中,不管是對底層的數(shù)據(jù)邏輯操作過程,還是業(yè)務邏輯的處理過程,還是控制邏輯的處理過程,都不可避免會遇到各種可預知的、不可預知的異常。處理好異常對系統(tǒng)有很好的保護作用,同時會大大提高用戶的體驗。
異常處理分析
概述
Java項目中處理異常方式無非兩種,要么執(zhí)行trycatch操作,要么執(zhí)行throw操作(拋給其它對象處理),無論采用哪種方式,其目的是讓我們的系統(tǒng)對異常要有反饋。但現(xiàn)在的問題是我們?nèi)绾巫屵@種反饋代碼的編寫即簡單又直觀、友好。
處理規(guī)范
我們在處理異常的過程中通常要遵循一定的設(shè)計規(guī)范,例如:
- 捕獲異常時與拋出的異常必須完全匹配,或者捕獲異常是拋出異常的父類類型。
- 避免直接拋出RuntimeException,更不允許拋出Exception或者Throwable,應使用有業(yè)務含義的自定義異常(例如ServiceException)。
- 捕獲異常后必須進行處理(例如記錄日志)。如果不想處理它,需要將異常拋給它的調(diào)用者。
- 最外層的邏輯必須處理異常,將其轉(zhuǎn)化成用戶可以理解的內(nèi)容。
- 避免出現(xiàn)重復的代碼(Don't Repeat Yourself),即DAY原則。
SpringBoot 工程下的異常處理
準備工作
第一步:創(chuàng)建項目或module,并添加web依賴,代碼如下:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
第二步:修改項目訪問端口為80,例如
server.port=80
第三步:定義Controller類,代碼如下:
package com.cy.pj.arithmetic.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; @Controller public class ArithmeticController { @RequestMapping("doCompute/{n1}/{n2}") @ResponseBody public String doCompute(@PathVariable Integer n1, @PathVariable Integer n2){ Integer result=n1/n2; return "Result is "+result; } }
第四步啟動項目進行訪問測試
在瀏覽器地址欄輸入http://localhost/doCompute/10/2,檢測輸出結(jié)果。
Result is 5
默認異常處理
在瀏覽器地址欄輸入http://localhost/doCompute/10/0,檢測輸出結(jié)果。
對于這樣的默認異常處理(spring boot提供),用戶體驗不太友好,為了呈現(xiàn)更加友好的異常信息,我們通常要對異常進行自定義處理。
自己try異常處理
在控制層方法中,我們可以進行try catch處理,例如:
@RequestMapping("doCompute/{n1}/{n2}") @ResponseBody public String doCompute(@PathVariable Integer n1, @PathVariable Integer n2){ try{ Integer result=n1/n2; return "Result is "+result; }catch(ArithmeticException e){ return "exception is "+e.getMessage(); } }
一個Controller類中通常會有多個方法,這樣多個方法中都寫try語句進行異常處理會帶來大量重復代碼的編寫,不易維護。
Controller內(nèi)部定義異常處理方法
在Controller類中添加異常處理方法,代碼如下:
@ExceptionHandler(ArithmeticException.class) @ResponseBody public String doHandleArithmeticException(ArithmeticException e){ e.printStackTrace(); return "計算過程中出現(xiàn)了異常,異常信息為"+e.getMessage(); }
@ExceptionHandler注解描述的方法為異常處理方法(注解中的異常類型為可處理的異常類型),假如Controller類中的邏輯方法中出現(xiàn)異常后沒有處理異常,則會查找Controller類中有沒有定義異常處理方法,假如定義了,且可以處理拋出的異常類型,則由異常處理方法處理異常。
控制層中的全局異常處理類及方法定義
當項目由多個控制層類中有多個共性異常的處理方法定義時,我們可以將這些方法提取到公共的父類對象中,但是這種方式是一種強耦合的實現(xiàn),不利于代碼的維護。我們還可以借助spring框架中web模塊定義的全局異常處理規(guī)范進行實現(xiàn),例如定義全局異常處理類,代碼如下:
package com.cy.pj.common.web; @RestControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(ArithmeticException.class) public String doHandleArithmeticException(ArithmeticException e){ e.printStackTrace(); return "計算過程中出現(xiàn)了異常,異常信息為"+e.getMessage(); } }
其中,@RestControllerAdvice 注解描述的類為全局異常處理類,當控制層方法中的異常沒有自己捕獲,也沒有定義其內(nèi)部的異常處理方法,底層默認會查找全局異常處理類,調(diào)用對應的異常處理方法進行異常處理。
總結(jié)
到此這篇關(guān)于springboot異常處理基本規(guī)范的文章就介紹到這了,更多相關(guān)springboot異常處理規(guī)范內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
springboot集成gzip和zip數(shù)據(jù)壓縮傳輸(適用大數(shù)據(jù)信息傳輸)
?在大數(shù)據(jù)量的傳輸中,壓縮數(shù)據(jù)后進行傳輸可以一定程度的解決速度問題,本文主要介紹了springboot集成gzip和zip數(shù)據(jù)壓縮傳輸,具有一定的參考價值,感興趣的可以了解一下2023-09-09使用JSON.toJSONString格式化成json字符串時保留null屬性
這篇文章主要介紹了使用JSON.toJSONString格式化成json字符串時保留null屬性,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-06-06Java基礎(chǔ)之數(shù)組超詳細知識總結(jié)
這篇文章主要介紹了Java基礎(chǔ)之數(shù)組詳解,文中有非常詳細的代碼示例,對正在學習java基礎(chǔ)的小伙伴們有很好的幫助,需要的朋友可以參考下2021-05-05SpringBoot之ApplicationRunner解析(spring容器啟動完成執(zhí)行的類)
這篇文章主要介紹了SpringBoot之ApplicationRunner解析(spring容器啟動完成執(zhí)行的類),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-05-05