标准库的errors包不能完全满足我们的业务需求,通常我们需要自己创建一个错误包

1. 自定义error类型

Go中自定义error是非常简单的,实现Error() string接口即可

  1. package errcode
  2. type Error struct {
  3. Code int `json:"code"`
  4. Msg string `json:"msg"`
  5. Details []string `json:"details"`
  6. }
  7. func (e *Error) Error() string {
  8. return fmt.Sprintf("错误码:%d 错误信息:%s \n", e.Code, e.Msg)
  9. }

2. 新增创建Error的方法

  1. var codes = make(map[int]string)
  2. func NewError(code int, msg string) *Error {
  3. if _, ok := codes[code]; !ok {
  4. panic(fmt.Sprintf("错误码%d已存在,请更换一个", code))
  5. }
  6. codes[code] = msg
  7. return &Error{
  8. Code: code,
  9. Msg: msg,
  10. }
  11. }
  12. // 在原错误上创建一个带有更过细节信息的错误
  13. func (e *Error) WithDetails(details ...string) *Error {
  14. newError := *e
  15. newError.Details = make([]string, 0)
  16. for _, d := range details {
  17. newError.Details = append(newError.Details, d)
  18. }
  19. reutrn &newError
  20. }

3. 自定义常用错误

  1. var (
  2. Success = NewError(0, "成功")
  3. ServerError = NewError(10000000, "服务内部错误")
  4. InvalidParams = NewError(10000001, "入参错误")
  5. NotFound = NewError(10000002, "找不到")
  6. UnauthorizedAuthNotExist = NewError(10000003, "鉴权失败,找不到对应的用户")
  7. UnauthorizedTokenError = NewError(10000004, "鉴权失败,token错误")
  8. UnauthorizedTokenTimeout = NewError(10000005, "鉴权失败,token超时")
  9. UnauthorizedTokenGenerate = NewError(10000006, "鉴权失败,token生成失败")
  10. TooManyRequests = NewError(10000007, "请求过多")
  11. IdempotenceTokenError = NewError(10000008, "幂等性token错误")
  12. )

4. 新增错误码转响应码方法

  1. func (e *Error) StatusCode() int {
  2. switch e.Code {
  3. case Success.Code:
  4. return http.StatusOK
  5. case ServerError.Code:
  6. return http.StatusInternalServerError
  7. case InvalidParams.Code:
  8. return http.StatusBadRequest
  9. case NotFound.Code:
  10. return http.StatusNotFound
  11. case UnauthorizedAuthNotExist.Code:
  12. fallthrough
  13. case UnauthorizedTokenError.Code:
  14. fallthrough
  15. case UnauthorizedTokenTimeout.Code:
  16. fallthrough
  17. case UnauthorizedTokenGenerate.Code:
  18. return http.StatusUnauthorized
  19. case TooManyRequests.Code:
  20. return http.StatusTooManyRequest
  21. }
  22. return http.StatusInternalServerError
  23. }

5. 总结

  • 自定义错误类型直接实现error接口即可
  • 自定义常用错误方便使用
  • 自定义创建错误方便携带更过细节信息