package utils import ( "log" "net/http" "github.com/gin-gonic/gin" ) type BusinessError struct { Code int Msg string } type ErrorResult struct { Msg string `json:"msg,omitempty"` } func (e *BusinessError) Error() string { return e.Msg } func NewBusinessError(code int, msg string) *BusinessError { return &BusinessError{code, msg} } func ErrorHandler(c *gin.Context) { c.Next() for _, e := range c.Errors { switch err := e.Err.(type) { case *BusinessError: GinLogger(c).ERROR(err.Msg, "err", err.Error()) c.JSON(err.Code, &ErrorResult{err.Msg}) default: GinLogger(c).ERROR("generic error", "err", err.Error()) c.JSON(http.StatusInternalServerError, "ERROR") } return } } func ThrowAgError(c *gin.Context, err *BusinessError) { c.AbortWithError(err.Code, err) } func Error(c *gin.Context, code int, msg string) { c.AbortWithError(code, &BusinessError{code, msg}) } func AuthError(c *gin.Context) { Error(c, http.StatusUnauthorized, "INVALID_TOKEN") } func CodeError(c *gin.Context) { Error(c, http.StatusBadRequest, "WRONG_CODE") } func ParamError(c *gin.Context) { Error(c, http.StatusBadRequest, "INVALID_PARAM") } func PermissionError(c *gin.Context) { Error(c, http.StatusForbidden, "NO_PERMISSION") } func DbError(c *gin.Context) { Error(c, http.StatusInternalServerError, "DB_ERROR") } // 错误日志就近输出,后续不需要重复输出 // 无错误返回true func ErrorCheckAndLog(err error) bool { if err != nil { log.Println("db:", err) return false } return true }