AgileBoot - 項目內統一的錯誤碼設計

本篇文章主要探討關于統一錯誤碼的設計 , 并提供筆者的實現歡迎大家討論,指正 。
該錯誤碼的設計在倉庫:
github:https://github.com/valarchie/AgileBoot-Back-Endgitee:https://gitee.com/valarchie/AgileBoot-Back-End
統一的錯誤碼管理的優點

  1. 統一的錯誤碼描述,如果沒有統一的錯誤碼的話,錯誤描述散落在項目內的不同地方,同一個錯誤碼卻產生不同的錯誤描述,會導致歧義 。
  2. 錯誤碼的層級 , 在與客戶端的交互過程中,我們可能需要根據錯誤的層級,來做不同的顯示 。例如系統內部的錯誤,我們產生紅色的警告框 。業務上操作類型的錯誤(例如用戶名不能超過64位),我們則以正常的黃色提示框來提醒用戶 。
  3. i18n的處理 。統一的錯誤碼管理,才使得國際化更好實現 。我們可以給每一種錯誤碼定義唯一的key , 來找到對應不同語言的錯誤描述 。
  4. 集中的錯誤碼管理便于形成文檔供調用者參考 。例如我們提供接口給其他團隊調用,可以提供給他們詳細的錯誤碼列表 。
無錯誤碼設計的缺陷Ruoyi項目
AgileBoot - 項目內統一的錯誤碼設計

文章插圖
  1. 錯誤描述散落在項目的各個地方 , 一旦有改變錯誤描述的需求,要滿項目去尋找關聯的錯誤描述,然后逐一修改 。這種情形很容易造成疏漏 。
  2. 如果需要翻譯的話,這種隨意的字符串形式也很難去做國際化翻譯 。
  3. 沒有準確的錯誤碼 , 在一些情形下,調用方需要根據你返回的錯誤碼進行不同的處理 。如果沒有準確的錯誤碼,僅憑錯誤描述,比較難以實現 。
錯誤碼的層級錯誤碼的層級有助于客戶端對于不同級別的錯誤進行處理 。比如有的錯誤進行隱藏,有的錯誤直接暴露給用戶 。這邊我規劃了四層錯誤碼 。錯誤碼集合
  • 1~9999 為保留錯誤碼 或者 常用錯誤碼
  • 10000~19999 為內部錯誤碼
  • 20000~29999 客戶端錯誤碼 (客戶端異常調用之類的錯誤)
  • 30000~39999 為第三方錯誤碼 (代碼正常 , 但是第三方異常)
  • 40000~49999 為業務邏輯 錯誤碼 (無異常,代碼正常流轉,并返回提示給用戶)
錯誤碼的模塊為了更好的分門別類 , 筆者給錯誤碼設定了模塊,便于客戶端的特殊處理 。例如客戶端可以專門給某一個模塊的錯誤進行一個統一的處理 。模塊對應的數字在千位和百位 。例如1XX01,XX代表了模塊的意義 。
/** * 系統內的模塊 */public enum Module {/*** 普通模塊*/COMMON(0),/*** 權限模塊*/PERMISSION(1),/*** 登錄模塊*/LOGIN(2),/*** 數據庫模塊*/DB(3),/*** 上傳*/UPLOAD(4),/*** 用戶*/USER(5),/*** 配置*/CONFIG(6),/*** 職位*/POST(7),;private final int code;Module(int code) { this.code = code * 100; }public int code() {return code; }}錯誤碼代碼例子
/*** 10000~19999是內部錯誤碼例如 框架有問題之類的*/public enum Internal implements ErrorCodeInterface {/*** 內部錯誤碼*/INVALID_PARAMETER(Module.COMMON, 1, "參數異常"),UNKNOWN_ERROR(Module.COMMON, 2, "未知異常, 請查看系統日志"),GET_ENUM_FAILED(Module.COMMON, 3, "獲取枚舉類型失敗, 枚舉類: {}"),GET_CACHE_FAILED(Module.COMMON, 4, "獲取緩存失敗"),LOGIN_CAPTCHA_GENERATE_FAIL(Module.LOGIN, 1, "驗證碼生成失敗"),INVALID_TOKEN(Module.PERMISSION, 1, "token異常"),DB_INTERNAL_ERROR(Module.DB, 1, "數據庫異常: {}"),;private final int code;private final String msg;private static final int BASE_CODE = 10000;Internal(Module module, int code, String msg) {this.code = BASE_CODE + module.code() + code;this.msg = msg;}@Overridepublic int code() {return this.code;}@Overridepublic String message() {return this.msg;}}錯誤碼的使用為了便于錯誤碼在編寫代碼時方便使用,我創建了ErrorCode這個類,并將四個層級的錯誤類一并放進這個類當中 。
AgileBoot - 項目內統一的錯誤碼設計

文章插圖
代碼中的例子
if (roleService.checkRoleNameUnique(getRoleId(), getRoleName())) {throw new ApiException(ErrorCode.Business.ROLE_NAME_IS_NOT_UNIQUE, getRoleName()); }通過這樣的形式進行調用:

    推薦閱讀