淺析自定義異常為什么是繼承RuntimeException類以及RuntimeException、Exception兩種異常的用途


  在接口開發的過程中,為了程序的健壯性,經常要考慮到代碼執行的異常,並給前端一個友好的展示,這里就得用到自定義異常,繼承RuntimeException類。那么這個RuntimeException和普通的Exception有什么區別呢。

  1、Exception: 非運行時異常,在項目運行之前必須處理掉。一般由程序員try catch 掉。

  2、RuntimeException,運行時異常,在項目運行之后出錯則直接中止運行,異常由JVM虛擬機處理。

  在接口的邏輯判斷出現異常時,可能會影響后面代碼。或者說絕對不容忍(允許)該代碼塊出錯,那么我們就用RuntimeException,但是我們又不能因為系統掛掉,只在后台拋出異常而不給前端返回友好的提示吧,至少給前端返回出現異常的原因。因此接口的自定義異常作用就體現出來了。

  由於項目中自定義異常一般繼承 RuntimeException 所以想了解一下為什么。

一、異常基礎知識

  關於異常基礎知識詳見之前這篇博客:Java異常處理基礎知識筆記:異常處理機制、異常繼承關系、捕獲異常、拋出異常、異常的傳播、異常調用棧、自定義異常、第三方日志庫

二、runtimeException和exception的兩種異常的用途

  網上摘得一段話,比喻的很恰當:

  繼承Exception還是繼承RuntimeException是由異常本身的特點決定的,而不是由是否是自定義的異常決定的。

  例如我要寫一個java api,這個api中會調用一個極其操蛋的遠端服務,這個遠端服務經常超時和不可用。所以我決定以拋出自定義異常的形式向所有調用這個api的開發人員周知這一操蛋的現實,讓他們在調用這個api時務必考慮到遠端服務不可用時應該執行的補償邏輯(比如嘗試調用另一個api)。此時自定義的異常類就應繼承Exception,這樣其他開發人員在調用這個api時就會收到編譯器大大的紅色報錯:【你沒處理這個異常!】,強迫他們處理

  又如,我要寫另一個api,這個api會訪問一個非常非常穩定的遠端服務,除非有人把遠端服務的機房炸了,否則這個服務不會出現不可用的情況。而且即便萬一這種情況發生了,api的調用者除了記錄和提示錯誤之外也沒有別的事情好做。但出於某種不可描述的蛋疼原因,我還是決定要定義一個異常對象描述“機房被炸”這一情況,那么此時定義的異常類就應繼承RuntimeException,因為我的api的調用者們沒必要了解這一細微的細節,把這一異常交給統一的異常處理層去處理就好了。

  總結一下:

  拋出 RuntimeException(運行期才可以發現的異常),調用方法的程序員不需要知道會出這個異常。

  拋出Exception的方法,調用者需要明確知道這個方法里會出現什么異常,並提示調用者要去處理這個可能得異常。

  簡單的說,非RuntimeException必要自己寫catch塊處理掉。RuntimeException不用try catch捕捉將會導致程序運行中斷,若用則不會中斷。

三、自定義異常代碼示例

1、直接返回RuntimeException異常消息

if (StringUtils.isBlank(assignee)) { throw new RuntimeException("注冊表中未查到用戶手機號"); }

2、繼承RuntimeException類自定義異常

package com.opengauss.exam.common.exception; import lombok.Data; import lombok.EqualsAndHashCode; import org.springframework.http.HttpStatus; @EqualsAndHashCode(callSuper = true) @Data public class ExamCustomException extends RuntimeException { //異常信息
    private String message; private String code; private HttpStatus status; private Object data; public ExamCustomException(String message) { super(message); this.message = message; } public ExamCustomException(String message, String code) { super(message); this.message = message; this.code = code; } public ExamCustomException(String message, HttpStatus status) { super(message); this.message = message; this.status = status; } public ExamCustomException(String message, Object data) { super(message); this.message = message; this.data = data; } }

3、使用自定義異常示例

//獲取用戶身份信息
CertifiedUser certifiedUser = this.currentUser(); if (null == certifiedUser) { throw new ExamCustomException("用戶信息獲取失敗"); }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM