使用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的同学,经常抱怨"写起来多爽,维护起来多.."

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