123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207 |
- package apierr
- import (
- "encoding/json"
- "kpt-tmr-group/pkg/xerr"
- common "kpt-tmr-group/proto/go/backend/common"
- "net/http"
- "github.com/gin-gonic/gin"
- )
- func New(code common.Error_Code) *Error {
- return &Error{err: &common.Error{
- Code: code,
- Msg: errorMessage(code),
- }}
- }
- func errorMessage(code common.Error_Code) string {
- var errMessage string
- if msg, ok := common.Error_Code_name[int32(code)]; ok {
- errMessage = msg
- } else {
- errMessage = "INTERNAL_ERROR"
- }
- return errMessage
- }
- type Error struct {
- err *common.Error
- }
- func (e *Error) GetCode() common.Error_Code {
- return e.err.Code
- }
- func (e *Error) GetMsg() string {
- return e.err.Msg
- }
- func (e *Error) GetErrors() []string {
- return e.err.Errors
- }
- func (e *Error) Error() string {
- bs, _ := json.Marshal(e.err)
- return string(bs)
- }
- // Is 判断 err 和 e 是否相同
- func (e *Error) Is(err error) bool {
- if gotErr, ok := err.(*Error); !ok {
- return false
- } else {
- return e.err.Code == gotErr.err.Code
- }
- }
- func (e *Error) MarshalJSON() ([]byte, error) {
- return json.Marshal(e.err)
- }
- func (e *Error) UnmarshalJSON(data []byte) error {
- var commonErr common.Error
- if err := json.Unmarshal(data, &commonErr); err != nil {
- return err
- }
- e.err = &commonErr
- return nil
- }
- func (e *Error) WithLocaleMessage(c *gin.Context) *Error {
- if msg := e.GetMsg(); msg != "" {
- return e.SetMessage(msg)
- }
- return e
- }
- func (e *Error) SetMessage(m string) *Error {
- e.err.Msg = m
- return e
- }
- func (e *Error) SetErrors(errMessages []string) *Error {
- e.err.Errors = errMessages
- return e
- }
- // With more information
- func (e *Error) With(errs ...error) *Error {
- for _, err := range errs {
- e.err.Errors = append(e.err.Errors, err.Error())
- }
- return e
- }
- // WithContext return error with i18n message ?
- func WithContext(c *gin.Context, code common.Error_Code) *Error {
- return New(code).WithLocaleMessage(c)
- }
- // AbortError 用来处理多种内部错误.
- // 在复杂业务场景中,存在一个接口返回多种业务错误码情况,通过这个函数来统一处理
- func AbortError(c *gin.Context, err error) {
- if err == nil {
- return
- }
- if e, ok := xerr.Cause(err).(*Error); ok {
- // 取默认状态码
- statusCode := DefaultErrorStatusCode(e.err.Code)
- if !shouldIgnoreCode(statusCode) {
- c.Error(e)
- }
- c.AbortWithStatusJSON(statusCode, e.WithLocaleMessage(c))
- return
- }
- c.Error(err)
- c.AbortWithStatusJSON(http.StatusInternalServerError, WithContext(c, common.Error_INTERNAL_ERROR).With(err))
- }
- // AbortStatusError 用来处理多种内部错误和定制返回的 http status code.
- // 在复杂业务场景中,存在一个接口返回多种业务错误码情况,通过这个函数来统一处理
- func AbortStatusError(c *gin.Context, httpCode int, err error) {
- if err == nil {
- return
- }
- if e, ok := xerr.Cause(err).(*Error); ok {
- c.Error(e)
- c.AbortWithStatusJSON(httpCode, WithContext(c, e.err.Code))
- return
- }
- c.Error(err)
- c.AbortWithStatusJSON(httpCode, WithContext(c, common.Error_INTERNAL_ERROR).With(err))
- }
- // DefaultErrorStatusCode 返回错误码对应的默认 http status code
- func DefaultErrorStatusCode(code common.Error_Code) int {
- if statusCode, ok := errorStatusCode[int(code)]; ok {
- return statusCode
- }
- return http.StatusInternalServerError
- }
- // 错误对应默认返回的 http status code
- var errorStatusCode = map[int]int{
- 0: http.StatusOK,
- 10000: http.StatusUnauthorized,
- 11000: http.StatusBadRequest,
- 11001: http.StatusBadRequest,
- 11002: http.StatusBadRequest,
- 11003: http.StatusTooManyRequests,
- 11100: http.StatusBadRequest,
- 11200: http.StatusBadRequest,
- 20000: http.StatusBadRequest,
- 21000: http.StatusBadRequest,
- 22000: http.StatusBadRequest,
- 23000: http.StatusBadRequest,
- 23001: http.StatusBadRequest,
- 24000: http.StatusBadRequest,
- 24100: http.StatusBadRequest,
- 24101: http.StatusBadRequest,
- 24102: http.StatusBadRequest,
- 24103: http.StatusBadRequest,
- 24104: http.StatusBadRequest,
- 24400: http.StatusBadRequest,
- 24500: http.StatusBadRequest,
- 24501: http.StatusBadRequest,
- 24502: http.StatusBadRequest,
- 24520: http.StatusBadRequest,
- 24521: http.StatusBadRequest,
- 24522: http.StatusBadRequest,
- 24523: http.StatusBadRequest,
- 24524: http.StatusBadRequest,
- 24525: http.StatusBadRequest,
- 24526: http.StatusBadRequest,
- 24527: http.StatusBadRequest,
- 24528: http.StatusBadRequest,
- 24600: http.StatusBadRequest,
- 24601: http.StatusBadRequest,
- 24602: http.StatusBadRequest,
- 24603: http.StatusBadRequest,
- 24700: http.StatusBadRequest,
- 24701: http.StatusBadRequest,
- 24702: http.StatusBadRequest,
- 24704: http.StatusBadRequest,
- 24705: http.StatusBadRequest,
- 24706: http.StatusBadRequest,
- 24707: http.StatusBadRequest,
- 24800: http.StatusBadRequest,
- 24801: http.StatusBadRequest,
- 24802: http.StatusBadRequest,
- 24803: http.StatusBadRequest,
- 90000: http.StatusInternalServerError,
- 90100: http.StatusBadRequest,
- 90101: http.StatusBadRequest,
- 90102: http.StatusBadRequest,
- 91000: http.StatusInternalServerError,
- }
|