做後端的同學們應該見到過很多錯誤碼,相信很多人都覺得定義錯誤碼很麻煩,雖說錯誤碼不是必不可少的環節,但是當項目大了之後,一個良好的錯誤碼設計,會給項目的debug帶來很多好處。
一個良好的錯誤碼設計應該包含至少3部分,一部分代表錯誤級別,一部分代表錯誤模塊,一部分代表錯誤類型,常見的設計爲5位數,下面用go與gin實現簡單的錯誤碼設計與使用
package errcode
import (
"fmt"
"github.com/gin-gonic/gin"
)
type ERRCODE struct {
code int //錯誤碼
msg string //錯誤信息
err error //debug錯誤信息
}
func (err *ERRCODE) getErr() {
fmt.Printf("Error - %d, message : %s ,error : %s",err.code, err.msg, err.err)
}
//返回gin.H格式
func (err * ERRCODE) GetH() gin.H {
return gin.H{"code":err.code, "msg":err.msg}
}
//設計原則,code爲5位數組成
//第一位代表錯誤級別,如1-系統錯誤,2-一般功能錯誤,3-數據庫錯誤,
//第二三位代表模塊,如01-article,02-auth,03-init
//第四五位代表錯誤類型,如01-密碼錯誤,02-發佈失敗
//模塊及常用錯誤對應表
/*
----第一位----
1-系統錯誤
2-數據庫錯誤
3-一般功能錯誤
4-調用外部api錯誤
----第二三位----
01-article
02-auth
03-init
----第四五位----
01-密碼錯誤
02-上傳文件過大
03-獲取菜單失敗
*/
//常用錯誤碼舉例
var (
Ok = &ERRCODE{code: 0, msg: "ok"}
// ------------ 系統錯誤 -----------
ErrParams = &ERRCODE{code: 10001, msg: "參數錯誤"}
FileOverMax = &ERRCODE{code: 10101, msg: "上傳文件過大"}
//------------- 一般功能錯誤 ------------
GetMenuError = &ERRCODE{code: 20303, msg: "獲取菜單失敗"}
)
當然還有更爲嚴謹的錯誤碼設計,包含更長的位數,會有包含具體業務具體功能的代碼段,但是考慮到實際debug的時候,程序員或者測試均知道錯誤發生時的具體請求地址,所以5位的長度在大部分場景中實際已經夠用。
由於是搭配gin使用,所以額外實現了一個getH,具體使用如下
package controller
import (
"blog/pkg/errcode"
"github.com/gin-gonic/gin"
)
//get background menu
func GetMenu(ctx *gin.Context) {
//舉例直接返回獲取菜單錯誤
ctx.JSON(200,errcode.GetMenuError.GetH())
}
雖然可能會覺得多設計一段東西很麻煩,但是前期準備越充分,後期維護就會越方便;前期越方便,後期維護就會越麻煩,這裏調侃一下用Python的同學,經常抱怨"寫起來多爽,維護起來多.."