[系列] Go - 统一定义 API 错误码

改之前

在使用 gin 开发接口的时候,返回接口数据是这样写的。

type response struct {
Code int         `json:"code"`
Msg  string      `json:"msg"`
Data interface{} `json:"data"`
}

// always return http.StatusOK
c.JSON(http.StatusOK, response{
Code: 20101,
Msg:  "用户手机号不合法",
Data: nil,
})

这种写法 codemsg 都是在哪需要返回在哪定义,没有进行统一管理。

改之后

// 比如,返回“用户手机号不合法”错误
c.JSON(http.StatusOK, errno.ErrUserPhone.WithID(c.GetString("trace-id")))

// 正确返回
c.JSON(http.StatusOK, errno.OK.WithData(data).WithID(c.GetString("trace-id")))

errno.ErrUserPhoneerrno.OK 表示自定义的错误码,下面会看到定义的地方。

.WithID() 设置当前请求的唯一ID,也可以理解为链路ID,忽略也可以。

.WithData() 设置成功时返回的数据。

下面分享下编写的 errno 包源码,非常简单,希望大家不要介意。

errno 包源码

// errno/errno.go

package errno

import (
"encoding/json"
)

var _ Error = (*err)(nil)

type Error interface {
// i 为了避免被其他包实现
i()
// WithData 设置成功时返回的数据
WithData(data interface{}) Error
// WithID 设置当前请求的唯一ID
WithID(id string) Error
// ToString 返回 JSON 格式的错误详情
ToString() string
}

type err struct {
Code int         `json:"code"`         // 业务编码
Msg  string      `json:"msg"`          // 错误描述
Data interface{} `json:"data"`         // 成功时返回的数据
ID   string      `json:"id,omitempty"` // 当前请求的唯一ID,便于问题定位,忽略也可以
}

func NewError(code int, msg string) Error {
return &err{
Code: code,
Msg:  msg,
Data: nil,
}
}

func (e *err) i() {}

func (e *err) WithData(data interface{}) Error {
e.Data = data
return e
}

func (e *err) WithID(id string) Error {
e.ID = id
return e
}

// ToString 返回 JSON 格式的错误详情
func (e *err) ToString() string {
err := &struct {
Code int         `json:"code"`
Msg  string      `json:"msg"`
Data interface{} `json:"data"`
ID   string      `json:"id,omitempty"`
}{
Code: e.Code,
Msg:  e.Msg,
Data: e.Data,
ID:   e.ID,
}

raw, _ := json.Marshal(err)
return string(raw)
}

// errno/code.go

package errno

var (
// OK
OK = NewError(0, "OK")

// 服务级错误码
ErrServer    = NewError(10001, "服务异常,请联系管理员")
ErrParam     = NewError(10002, "参数有误")
ErrSignParam = NewError(10003, "签名参数有误")

// 模块级错误码 - 用户模块
ErrUserPhone   = NewError(20101, "用户手机号不合法")
ErrUserCaptcha = NewError(20102, "用户验证码有误")

// ...
)

错误码规则

  • 错误码需在 code.go 文件中定义。
  • 错误码需为 > 0 的数,反之表示正确。

错误码为 5 位数

1 01 01
服务级错误码 模块级错误码 具体错误码
  • 服务级别错误码:1 位数进行表示,比如 1 为系统级错误;2 为普通错误,通常是由用户非法操作引起。
  • 模块级错误码:2 位数进行表示,比如 01 为用户模块;02 为订单模块。
  • 具体错误码:2 位数进行表示,比如 01 为手机号不合法;02 为验证码输入错误。
(0)

相关推荐

  • Opencv的异常处理方式

    如果调用函数出现错误并不直接返回错误代码,用CV_ERROR宏调用cvError函数,然后在cvError中调用error函数来报告错误信息. 在进入error函数之前,新建一个错误异常类,来保存当前 ...

  • Go 终极指南:编写一个 Go 工具

    https://arslan.io/2017/09/14/the-ultimate-guide-to-writing-a-go-tool/ 作者:Fatih Arslan 译者:oopsguy.com ...

  • 教学管理菜鸟成长记77-能用图表说话就别用文字系列之二……不会错的柱形图

    关键词:EXCEL2016:柱形图:折线图:操作难度*** 小菜有话说:身为教学管理人员,撰写各类总结报告是必修课.如何提炼工作中的亮点,以更直观的形式呈现,是每一名教学管理人员需要学习的内容.如果能 ...

  • 技术系列——中枢的定义

    枢这个概念在缠论中的地位是举足轻重的,它就如同天上的北斗,航海的罗盘,一个不患而患的参照系.看过学过缠论的人对中枢都不陌生,有了中枢,可以判断走势类型,有了中枢可以确定走势级别,有了中枢可以比较力度判 ...

  • 基于.NetCore3.1系列 —— 使用Swagger做Api文档 (上篇)

    前言 为什么在开发中,接口文档越来越成为前后端开发人员沟通的枢纽呢? 随着业务的发张,项目越来越多,而对于支撑整个项目架构体系而言,我们对系统业务的水平拆分,垂直分层,让业务系统更加清晰,从而产生一系 ...

  • 基于.NetCore3.1系列 —— 使用Swagger做Api文档 (下篇)

    前言 回顾上一篇文章<使用Swagger做Api文档 >,文中介绍了在.net core 3.1中,利用Swagger轻量级框架,如何引入程序包,配置服务,注册中间件,一步一步的实现,最终 ...

  • 领悟社会系列2:熊孩子的错还是熊家长的错?

    二.熊孩子的错还是熊家长的错?--致每位疼爱孩子的父母 都德的短篇小说<最后一课>,影响了无数人.但我印象中最深刻的一课,发生在小学四年级.作为典型的"熊孩子",我的胆 ...

  • EAGAIN 错误码含义

    在Linux环境下开发经常会碰到很多错误(设置errno),其中EAGAIN是其中比较常见的一个错误(比如用在非阻塞操作中). 从字面上来看,是提示再试一次.这个错误经常出现在当应用程序进行一些非阻塞 ...

  • 急性心肌梗死新定义(全球统一定义)

    心电图图库大全 急性心肌梗死新定义 (全球统一定义) 内容转载于:谷苟心电平台

  • 【指南解读】2018年全球心肌梗死统一定义更新解读

    关 注 论文作者:谭梦琴, 尹春娥, 王福军 作者单位:吉首大学第一附属医院心内二科 随着更为敏感的心脏生物标志物的出现,欧洲心脏病学会(ESC).美国心脏病学基金会(ACCF).美国心脏协会(AHA ...

  • 西藏阿里“心灵之旅”系列四——玛旁雍错

      在狮泉河镇,为了不耽误时间,我们早早的就来到了修理所.张医生说在蔬菜大棚里进行团体辅导环境会好些.进入大棚后,引入眼帘的就是一个奇妙的世界,我感觉犹如爱丽丝漫游奇境一般,跟着穿口袋背心的兔子发现了 ...