1 Star 1 Fork 0

dpnogo / errors

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
codes.go 2.56 KB
一键复制 编辑 原始数据 按行查看 历史
dpnogo 提交于 2021-12-10 20:56 . 设置Coder接口内容
package errors
import (
"fmt"
"net/http"
"sync"
)
//根据 code 默认展示信息的接口
var (
unknownCoder defaultCoder = defaultCoder{1, http.StatusInternalServerError, "An internal server error occurred", "http://github.com/marmotedu/errors/README.md"}
)
// 定义错误代码详细信息定义接口
// 因为最终返回的内容为 定义接口
//举例:
/*
Identifer(状态码对应const) | Code | HTTP Code | Description
ErrSucess(内部使用) 100001 200 OK (外部展示)
ErrSecretNotFound 110102 404 Secret not found
地址:
https://static001.geekbang.org/resource/image/b5/95/b58ff5b9455d13fc397fdf5228ea7195.png?wh=1441x1518
*/
//定义 Code 接口
type Coder interface {
// 对应HTTP的状态码
HTTPStatus() int
// err对应的状态码
Code() int
// code对应的错误描述(面向用户)
String() string
// 详情文档
Reference() string
}
type defaultCoder struct {
HTTPCode int
C int //字段名和方法名不能相同
CodeString string
Ref string
}
// 实现 Coder 接口
func (d defaultCoder) HTTPStatus() int {
if d.HTTPCode == 0 {
return 500
}
return d.HTTPCode
}
func (d defaultCoder) Code() int {
return d.C
}
func (d defaultCoder) String() string { return d.CodeString }
func (d defaultCoder) Reference() string { return d.Ref }
// 定义Coder集合
var coders = map[int]Coder{}
var rw sync.RWMutex
//然后进行注册
func Register(c Coder) {
if c.Code() == 0 { //验证 code 是否存在
panic("code `0` is reserved by `github.com/marmotedu/errors` as unknownCode error code")
}
rw.Lock()
defer rw.Unlock()
coders[c.Code()] = c
}
func MustRegister(c Coder) {
//先进行判断是否含有 若有则进行panic
if c.Code() == 0 { //验证 code 是否存在
panic("code `0` is reserved by `github.com/marmotedu/errors` as unknownCode error code")
}
rw.Lock()
defer rw.Unlock()
if _, ok := coders[c.Code()]; ok {
panic(fmt.Sprintf("code: %d already exist", c.Code()))
}
coders[c.Code()] = c
}
//得到 err 对应的 Coder接口
func ParseCoder(err error) Coder {
if err == nil {
return nil
}
if v, ok := err.(*withCode); ok {
if coder, ok := coders[v.code]; ok {
return coder
}
}
return unknownCoder
}
//判断withCode是否存在
func IsCode(err error, code int) bool {
if v, ok := err.(*withCode); ok {
if v.code == code {
return true
}
if v.cause != nil {
return IsCode(v.cause, code)
}
return false
}
return false
}
func init() {
//初始化默认的code
coders[unknownCoder.Code()] = unknownCoder
}
Go
1
https://gitee.com/GomiTo/errors.git
git@gitee.com:GomiTo/errors.git
GomiTo
errors
errors
bf56b27a1b0d

搜索帮助