springBoot項目中的全局異常處理和自定義異常處理實現(xiàn)
1 什么是異常
異常(Exception)是在程序執(zhí)行過程中出現(xiàn)的一種特殊情況或錯誤。它可以是由于程序邏輯錯誤、運行環(huán)境問題、用戶輸入錯誤等原因?qū)е碌囊环N非正常的狀態(tài)或事件。
在編程領(lǐng)域中,異常通常用來表示一種無法預(yù)料或處理的情況,它會導(dǎo)致程序無法繼續(xù)正常執(zhí)行。當(dāng)程序運行過程中遇到異常,如果沒有適當(dāng)?shù)奶幚頇C制,可能會導(dǎo)致程序崩潰或產(chǎn)生未預(yù)期的結(jié)果。
2 異常的種類
Checked Exception(已檢查異常):這類異常是在編譯時強制要求程序員進行處理的異常,如文件未找到、數(shù)據(jù)庫連接失敗等。Java 中的 checked exception 必須在方法簽名中聲明,或者使用 try-catch 塊進行捕獲處理,否則編譯不通過。
Unchecked Exception(未檢查異常):也稱為運行時異常(RuntimeException),通常是由于編程錯誤或者運行環(huán)境出現(xiàn)問題引起的異常,如空指針異常(NullPointerException)、數(shù)組越界異常(ArrayIndexOutOfBoundsException)等。編譯器不要求強制捕獲或者聲明這類異常,程序員可以選擇捕獲和處理,但不是必須的。
處理異常的主要目的是為了保證程序的穩(wěn)定性和可靠性。通常的處理方式包括捕獲異常、記錄異常信息、恢復(fù)程序狀態(tài)、通知用戶等。
3 解決異常的方式
1、捕獲和處理異常(try-catch):
- 使用
try-catch
塊來捕獲可能拋出異常的代碼塊。 - 在
try
塊中編寫可能引發(fā)異常的代碼,然后在catch
塊中處理異常。 - 這種方式適用于已檢查異常(checked exception),以及可以預(yù)料到可能出現(xiàn)的異常情況
2、拋出異常(throw):
- 在方法中使用
throw
關(guān)鍵字拋出異常,告知調(diào)用者可能發(fā)生的異常情況。 - 通常在方法內(nèi)部檢測到無法處理的情況時拋出異常,將問題交給上層調(diào)用者處理。
3、使用 finally 塊:
finally
塊中的代碼總是會被執(zhí)行,無論是否拋出異常,用于釋放資源或者確保某些操作一定會執(zhí)行。
4、使用 try-with-resources:
- 對于實現(xiàn)了
AutoCloseable
接口的資源,可以使用 try-with-resources 語句,確保資源在使用后自動關(guān)閉。 - 適用于需要手動關(guān)閉的資源管理,如文件操作、數(shù)據(jù)庫連接等。
4 全局異常處理器和自定義異常處理器
全局異常處理器是一種集中處理應(yīng)用程序中所有未捕獲異常的機制,常用于 Web 應(yīng)用程序中,以提供統(tǒng)一的異常處理和用戶友好的錯誤響應(yīng)。在 Java 的 Spring 框架中,可以使用 @ControllerAdvice
和 @ExceptionHandler
注解來實現(xiàn)全局異常處理。在全局異常處理器中,解決了異常種類繁多以及每個業(yè)務(wù)里面都需要去處理異常,所以Spring中提供了一種上層調(diào)用的方式來進行異常處理,把數(shù)據(jù)層和業(yè)務(wù)層的異常都向上拋放到應(yīng)用層來處理,這樣就可以統(tǒng)一對異常進行處理
類:ProjectExceptionAdvice
package com.hyh.ad.common.exceptionhandler; import cn.hutool.core.date.DateTime; import com.hyh.ad.common.core.domain.AjaxResult; import com.hyh.ad.common.exceptions.BusinessException; import com.hyh.ad.common.exceptions.SystemException; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; /** * 異常處理切面 * 處理BusinessException異常 * 處理SystemException異常 * @author hyh */ @Slf4j @RestControllerAdvice public class ProjectExceptionAdvice { /** * @param e * @return 業(yè)務(wù)異常處理的信息 */ @ExceptionHandler(BusinessException.class) public AjaxResult handleBusinessException(BusinessException e) { //記錄日志 log.error(e.getMessage(), e); //返回錯誤信息 return AjaxResult.error(e.getCode(), e.getMessage()); } /** * @param e * @return 系統(tǒng)異常處理的信息 */ @ExceptionHandler(SystemException.class) public AjaxResult handleSystemException(BusinessException e) { //記錄日志 log.error(e.getMessage(), e); //返回錯誤信息 return AjaxResult.error(e.getCode(), e.getMessage()); } /** * 自定義異常處理的信息 * 其他異常都經(jīng)過這個來處理 也可以自己來定義自己需要的異常處理 * @param e * @return */ @ExceptionHandler(Exception.class) public AjaxResult doException(Exception e) { //記錄日志 log.error(e.getMessage(), e); //返回錯誤信息 return AjaxResult.error(e.getMessage() + DateTime.now()); } }
其中AjaxResult請換成自己封裝的用于返回數(shù)據(jù)結(jié)果的對象
在這個類里面可以對所有的異常進行處理,包括系統(tǒng)異常、編譯異常、運行異常、自定義異常這些異常返回相對友好的信息。
類:BusinessException 業(yè)務(wù)異常
package com.hyh.ad.common.exceptions; /** * 業(yè)務(wù)異常處理器 * @author hyh */ 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) { 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; } public BusinessException(Throwable cause, Integer code) { super(cause); this.code = code; } public BusinessException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace, Integer code) { super(message, cause, enableSuppression, writableStackTrace); this.code = code; } }
類:SystemException 系統(tǒng)異常
package com.hyh.ad.common.exceptions; /** * 系統(tǒng)異常處理器 * @author hyh */ 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) { 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; } public SystemException(Throwable cause, Integer code) { super(cause); this.code = code; } public SystemException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace, Integer code) { super(message, cause, enableSuppression, writableStackTrace); this.code = code; } }
5 測試異常處理
這里就是我模擬的一個發(fā)送郵箱驗證碼的異常,他把異常信息返還給了前端,并且還帶有異常發(fā)生的時間。
接下來 我手動模擬了一個異常 然后再次請求一下數(shù)據(jù)
可以看到 返回了我們自定義的異常信息,包括提示信息和編碼
到此這篇關(guān)于springBoot項目中的全局異常處理和自定義異常處理實現(xiàn)的文章就介紹到這了,更多相關(guān)springBoot 全局異常和自定義異常內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot集成WebSocket實現(xiàn)后臺向前端推送信息的示例
這篇文章主要介紹了SpringBoot集成WebSocket實現(xiàn)后臺向前端推送信息的示例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12簡單談?wù)刯ava的異常處理(Try Catch Finally)
在程序設(shè)計中,進行異常處理是非常關(guān)鍵和重要的一部分。一個程序的異常處理框架的好壞直接影響到整個項目的代碼質(zhì)量以及后期維護成本和難度。2016-03-03