使用go設計錯誤碼

做後端的同學們應該見到過很多錯誤碼,相信很多人都覺得定義錯誤碼很麻煩,雖說錯誤碼不是必不可少的環節,但是當項目大了之後,一個良好的錯誤碼設計,會給項目的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的同學,經常抱怨"寫起來多爽,維護起來多.."

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章