1 Star 0 Fork 0

dpnogo / iam

Create your Gitee Account
Explore and code with more than 12 million developers,Free private repositories !:)
Sign up
Clone or Download
codes.go 2.60 KB
Copy Edit Raw Blame History
dpnogo authored 2022-03-07 11:55 . 构建的错误包
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 // code 描述
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
}
// 传来接口 添加 Coder
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
}
1
https://gitee.com/GomiTo/iam.git
git@gitee.com:GomiTo/iam.git
GomiTo
iam
iam
455e706b39fb

Search