AgileBoot?項目內統(tǒng)一的錯誤碼設計分析
引言
本篇文章主要探討關于統(tǒng)一錯誤碼的設計,并提供筆者的實現(xiàn)
歡迎大家討論,指正。
該錯誤碼的設計在倉庫:
github:github.com/valarchie/A…
gitee:gitee.com/valarchie/A…
統(tǒng)一的錯誤碼管理的優(yōu)點
- 統(tǒng)一的錯誤碼描述,如果沒有統(tǒng)一的錯誤碼的話,錯誤描述散落在項目內的不同地方,同一個錯誤碼卻產(chǎn)生不同的錯誤描述,會導致歧義。
- 錯誤碼的層級,在與客戶端的交互過程中,我們可能需要根據(jù)錯誤的層級,來做不同的顯示。例如系統(tǒng)內部的錯誤,我們產(chǎn)生紅色的警告框。業(yè)務上操作類型的錯誤(例如用戶名不能超過64位),我們 則以正常的黃色提示框來提醒用戶。
- i18n的處理。統(tǒng)一的錯誤碼管理,才使得國際化更好實現(xiàn)。我們可以給每一種錯誤碼定義唯一的key,來找到對應不同語言的錯誤描述。
- 集中的錯誤碼管理便于形成文檔供調用者參考。例如我們提供接口給其他團隊調用,可以提供給他們詳細的錯誤碼列表。
無錯誤碼設計的缺陷
Ruoyi項目

- 錯誤描述散落在項目的各個地方,一旦有改變錯誤描述的需求,要滿項目去尋找關聯(lián)的錯誤描述,然后逐一修改。這種情形很容易造成疏漏。
- 如果需要翻譯的話,這種隨意的字符串形式也很難去做國際化翻譯。
- 沒有準確的錯誤碼,在一些情形下,調用方需要根據(jù)你返回的錯誤碼進行不同的處理。如果沒有準確的錯誤碼,僅憑錯誤描述,比較難以實現(xiàn)。
錯誤碼的層級
錯誤碼的層級有助于客戶端對于不同級別的錯誤進行處理。比如有的錯誤進行隱藏,有的錯誤直接暴露給用戶。這邊我規(guī)劃了四層錯誤碼。 錯誤碼集合
- 1~9999 為保留錯誤碼 或者 常用錯誤碼
- 10000~19999 為內部錯誤碼
- 20000~29999 客戶端錯誤碼 (客戶端異常調用之類的錯誤)
- 30000~39999 為第三方錯誤碼 (代碼正常,但是第三方異常)
- 40000~49999 為業(yè)務邏輯 錯誤碼 (無異常,代碼正常流轉,并返回提示給用戶)
錯誤碼的模塊
為了更好的分門別類,筆者給錯誤碼設定了模塊,便于客戶端的特殊處理。例如客戶端可以專門給某一個模塊的錯誤進行一個統(tǒng)一的處理。 模塊對應的數(shù)字在千位和百位。例如1XX01,XX代表了模塊的意義。
/**
* 系統(tǒng)內的模塊
*/
public enum Module {
/**
* 普通模塊
*/
COMMON(0),
/**
* 權限模塊
*/
PERMISSION(1),
/**
* 登錄模塊
*/
LOGIN(2),
/**
* 數(shù)據(jù)庫模塊
*/
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, "參數(shù)異常"),
UNKNOWN_ERROR(Module.COMMON, 2, "未知異常, 請查看系統(tǒng)日志"),
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, "數(shù)據(jù)庫異常: {}"),
;
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;
}
@Override
public int code() {
return this.code;
}
@Override
public String message() {
return this.msg;
}
}
錯誤碼的使用
為了便于錯誤碼在編寫代碼時方便使用,我創(chuàng)建了ErrorCode這個類,并將四個層級的錯誤類一并放進這個類當中。

代碼中的例子
if (roleService.checkRoleNameUnique(getRoleId(), getRoleName())) {
throw new ApiException(ErrorCode.Business.ROLE_NAME_IS_NOT_UNIQUE, getRoleName());
}
通過這樣的形式進行調用:ErrorCode.Business.ROLE_NAME_IS_NOT_UNIQUE
該錯誤碼的設計缺陷
缺陷在于:
- 一個模塊內的錯誤碼上線是100個。 解決該問題的話,有兩種形式。一是:盡量設計比較通用的錯誤碼,粒度過細會導致錯誤碼不夠用。二是:使用重復的模塊,比如原來User模塊,再起一個User2模塊。
探討關于錯誤碼的設計,歡迎小伙伴留言評論指正。
Any corrections or suggestions are appreciated.
Agileboot是一個致力于規(guī)范、質量,健壯的前后端開發(fā)腳手架。
以上就是AgileBoot 項目內統(tǒng)一的錯誤碼設計分析的詳細內容,更多關于AgileBoot 項目內統(tǒng)一錯誤碼的資料請關注腳本之家其它相關文章!
相關文章
解決MyBatisPlus的updateBatchById()批量修改失效問題
這篇文章主要介紹了解決MyBatisPlus的updateBatchById()批量修改失效問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-08-08
java poi sax方式處理大數(shù)據(jù)量excel文件
這篇文章主要介紹了java poi sax方式處理大數(shù)據(jù)量excel文件,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-01-01
Java線程池ThreadPoolExecutor源碼深入分析
ThreadPoolExecutor作為java.util.concurrent包對外提供基礎實現(xiàn),以內部線程池的形式對外提供管理任務執(zhí)行,線程調度,線程池管理等等服務2022-08-08
InvocationHandler中invoke()方法的調用問題分析
這篇文章主要介紹了InvocationHandler中invoke()方法的調用問題分析,具有一定參考價值,需要的朋友可以了解下。2017-11-11

