Skip to content

异常处理


说明

在框架中如果一但调用了 panic() 就会被内置的异常处理中间件捕获并通过 ctx.Fail() 将错误以json的形式返回

// recoveryMiddleware 全局异常捕获中间件
func recoveryMiddleware() HandlerFunc {
	return func(ctx *Context) {
		defer func() {
			if err := recover(); err != nil {
				if e, ok := err.(Exception); ok {
					jsonStr, _ := json.Marshal(e)
					tglog.Log().Error(string(jsonStr))
					ctx.Fail(e.Message, FailOption{ 
						StatusCode: e.StateCode, 
						ErrorCode:  e.ErrorCode, 
					}) 
				} else {
					fmt.Println(err)
				}
			}
		}()
		ctx.Next()
	}
}
// recoveryMiddleware 全局异常捕获中间件
func recoveryMiddleware() HandlerFunc {
	return func(ctx *Context) {
		defer func() {
			if err := recover(); err != nil {
				if e, ok := err.(Exception); ok {
					jsonStr, _ := json.Marshal(e)
					tglog.Log().Error(string(jsonStr))
					ctx.Fail(e.Message, FailOption{ 
						StatusCode: e.StateCode, 
						ErrorCode:  e.ErrorCode, 
					}) 
				} else {
					fmt.Println(err)
				}
			}
		}()
		ctx.Next()
	}
}

如何您想抛出一个异常,并且让前端可以看到,可以这样写

panic(tg.Exception{
    StateCode: 401,
    ErrorCode: 10002,
    Message: "遇到了一个错误",
    Error: err,
})
panic(tg.Exception{
    StateCode: 401,
    ErrorCode: 10002,
    Message: "遇到了一个错误",
    Error: err,
})

常用错误码

var ErrorCode = &errorCode{
	VALIDATE:    10001, // 验证类错误
	TokenExpire: 10002, // Token过期
	EXCEPTION:   20001, // 服务或代码异常类错误
	MySqlError:  20002, // mysql错误
	RedisError:  20003, // redis错误
}
var ErrorCode = &errorCode{
	VALIDATE:    10001, // 验证类错误
	TokenExpire: 10002, // Token过期
	EXCEPTION:   20001, // 服务或代码异常类错误
	MySqlError:  20002, // mysql错误
	RedisError:  20003, // redis错误
}

备案号:冀ICP备20015584号-5