AgileBoot?項(xiàng)目內(nèi)統(tǒng)一的錯(cuò)誤碼設(shè)計(jì)分析
引言
本篇文章主要探討關(guān)于統(tǒng)一錯(cuò)誤碼的設(shè)計(jì),并提供筆者的實(shí)現(xiàn)
歡迎大家討論,指正。
該錯(cuò)誤碼的設(shè)計(jì)在倉庫:
github:github.com/valarchie/A…
gitee:gitee.com/valarchie/A…
統(tǒng)一的錯(cuò)誤碼管理的優(yōu)點(diǎn)
- 統(tǒng)一的錯(cuò)誤碼描述,如果沒有統(tǒng)一的錯(cuò)誤碼的話,錯(cuò)誤描述散落在項(xiàng)目內(nèi)的不同地方,同一個(gè)錯(cuò)誤碼卻產(chǎn)生不同的錯(cuò)誤描述,會導(dǎo)致歧義。
- 錯(cuò)誤碼的層級,在與客戶端的交互過程中,我們可能需要根據(jù)錯(cuò)誤的層級,來做不同的顯示。例如系統(tǒng)內(nèi)部的錯(cuò)誤,我們產(chǎn)生紅色的警告框。業(yè)務(wù)上操作類型的錯(cuò)誤(例如用戶名不能超過64位),我們 則以正常的黃色提示框來提醒用戶。
- i18n的處理。統(tǒng)一的錯(cuò)誤碼管理,才使得國際化更好實(shí)現(xiàn)。我們可以給每一種錯(cuò)誤碼定義唯一的key,來找到對應(yīng)不同語言的錯(cuò)誤描述。
- 集中的錯(cuò)誤碼管理便于形成文檔供調(diào)用者參考。例如我們提供接口給其他團(tuán)隊(duì)調(diào)用,可以提供給他們詳細(xì)的錯(cuò)誤碼列表。
無錯(cuò)誤碼設(shè)計(jì)的缺陷
Ruoyi項(xiàng)目
- 錯(cuò)誤描述散落在項(xiàng)目的各個(gè)地方,一旦有改變錯(cuò)誤描述的需求,要滿項(xiàng)目去尋找關(guān)聯(lián)的錯(cuò)誤描述,然后逐一修改。這種情形很容易造成疏漏。
- 如果需要翻譯的話,這種隨意的字符串形式也很難去做國際化翻譯。
- 沒有準(zhǔn)確的錯(cuò)誤碼,在一些情形下,調(diào)用方需要根據(jù)你返回的錯(cuò)誤碼進(jìn)行不同的處理。如果沒有準(zhǔn)確的錯(cuò)誤碼,僅憑錯(cuò)誤描述,比較難以實(shí)現(xiàn)。
錯(cuò)誤碼的層級
錯(cuò)誤碼的層級有助于客戶端對于不同級別的錯(cuò)誤進(jìn)行處理。比如有的錯(cuò)誤進(jìn)行隱藏,有的錯(cuò)誤直接暴露給用戶。這邊我規(guī)劃了四層錯(cuò)誤碼。 錯(cuò)誤碼集合
- 1~9999 為保留錯(cuò)誤碼 或者 常用錯(cuò)誤碼
- 10000~19999 為內(nèi)部錯(cuò)誤碼
- 20000~29999 客戶端錯(cuò)誤碼 (客戶端異常調(diào)用之類的錯(cuò)誤)
- 30000~39999 為第三方錯(cuò)誤碼 (代碼正常,但是第三方異常)
- 40000~49999 為業(yè)務(wù)邏輯 錯(cuò)誤碼 (無異常,代碼正常流轉(zhuǎn),并返回提示給用戶)
錯(cuò)誤碼的模塊
為了更好的分門別類,筆者給錯(cuò)誤碼設(shè)定了模塊,便于客戶端的特殊處理。例如客戶端可以專門給某一個(gè)模塊的錯(cuò)誤進(jìn)行一個(gè)統(tǒng)一的處理。 模塊對應(yīng)的數(shù)字在千位和百位。例如1XX01,XX代表了模塊的意義。
/** * 系統(tǒng)內(nèi)的模塊 */ public enum Module { /** * 普通模塊 */ COMMON(0), /** * 權(quán)限模塊 */ 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; } }
錯(cuò)誤碼代碼例子
/** * 10000~19999是內(nèi)部錯(cuò)誤碼 例如 框架有問題之類的 */ public enum Internal implements ErrorCodeInterface { /** * 內(nèi)部錯(cuò)誤碼 */ 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, "驗(yàn)證碼生成失敗"), 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; } }
錯(cuò)誤碼的使用
為了便于錯(cuò)誤碼在編寫代碼時(shí)方便使用,我創(chuàng)建了ErrorCode這個(gè)類,并將四個(gè)層級的錯(cuò)誤類一并放進(jìn)這個(gè)類當(dāng)中。
代碼中的例子
if (roleService.checkRoleNameUnique(getRoleId(), getRoleName())) { throw new ApiException(ErrorCode.Business.ROLE_NAME_IS_NOT_UNIQUE, getRoleName()); }
通過這樣的形式進(jìn)行調(diào)用:ErrorCode.Business.ROLE_NAME_IS_NOT_UNIQUE
該錯(cuò)誤碼的設(shè)計(jì)缺陷
缺陷在于:
- 一個(gè)模塊內(nèi)的錯(cuò)誤碼上線是100個(gè)。 解決該問題的話,有兩種形式。一是:盡量設(shè)計(jì)比較通用的錯(cuò)誤碼,粒度過細(xì)會導(dǎo)致錯(cuò)誤碼不夠用。二是:使用重復(fù)的模塊,比如原來User模塊,再起一個(gè)User2模塊。
探討關(guān)于錯(cuò)誤碼的設(shè)計(jì),歡迎小伙伴留言評論指正。
Any corrections or suggestions are appreciated.
Agileboot是一個(gè)致力于規(guī)范、質(zhì)量,健壯的前后端開發(fā)腳手架。
以上就是AgileBoot 項(xiàng)目內(nèi)統(tǒng)一的錯(cuò)誤碼設(shè)計(jì)分析的詳細(xì)內(nèi)容,更多關(guān)于AgileBoot 項(xiàng)目內(nèi)統(tǒng)一錯(cuò)誤碼的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
JavaWeb如何實(shí)現(xiàn)限制單個(gè)賬號多處登錄
這篇文章主要介紹了JavaWeb如何實(shí)現(xiàn)限制單個(gè)賬號多處登錄問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08IntelliJ IDEA使用快捷鍵重命名項(xiàng)目、變量、文件等方法總結(jié)
今天小編就為大家分享一篇關(guān)于IntelliJ IDEA使用快捷鍵重命名項(xiàng)目、變量、文件等方法總結(jié),小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2018-10-10Springboot使用Junit測試沒有插入數(shù)據(jù)的原因
這篇文章主要介紹了Springboot使用Junit測試沒有插入數(shù)據(jù)的原因,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-04-04SpringBoot+WebSocket實(shí)現(xiàn)即時(shí)通訊的方法詳解
這篇文章主要為大家詳細(xì)介紹了如何利用SpringBoot+WebSocket實(shí)現(xiàn)即時(shí)通訊功能,文中示例代碼講解詳細(xì),對我們學(xué)習(xí)或工作有一定參考價(jià)值,需要的可以參考一下2022-05-05SpringBoot自動配置實(shí)現(xiàn)的詳細(xì)步驟
這篇文章主要為大家介紹了SpringBoot自動配置實(shí)現(xiàn)詳細(xì)的過程步驟,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05SpringBoot中的@EnableConfigurationProperties注解原理及用法
在SpringBoot中,@EnableConfigurationProperties注解是一個(gè)非常有用的注解,它可以用于啟用對特定配置類的支持,在本文中,我們將深入探討@EnableConfigurationProperties注解,包括它的原理和如何使用,需要的朋友可以參考下2023-06-06完美解決Spring Boot前端的Access-Control-Allow-Origin跨域問題
這篇文章主要介紹了完美解決Spring Boot前端的Access-Control-Allow-Origin跨域問題,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-05-05Java實(shí)現(xiàn)復(fù)原IP地址的方法
這篇文章主要介紹了Java實(shí)現(xiàn)復(fù)原IP地址的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-02-02