GO Iris框架的全局异常处理

Jimmy Lee

技术分享|Mar 16, 2022|Last edited: 2022-7-26|
icon
Update time
Jul 26, 2022 06:11 AM
Internal status
password
可以使用panic造成异常,而不是层层往上返回错误,在recover中处理错误
//启动设置 app := iris.New() app.Use(customRecover) //处理逻辑 func customRecover(ctx iris.Context) { defer func() { if err := recover(); err != nil { if ctx.IsStopped() { return } var stacktrace string for i := 1; ; i++ { _, f, l, got := runtime.Caller(i) if !got { break } stacktrace += fmt.Sprintf("%s:%d\n", f, l) } ctx.StatusCode(200) if ex, ok := err.(*commons.ErrorCode); ok { //如果是业务异常,则返回业务异常信息 _, _ = ctx.JSON(ex.Error()) ctx.Application().Logger().Printf("[%d] %s\n%s", ex.Code, ex.Message, stacktrace) } else { //如果不是认为抛出的异常,统一包装为系统异常 _, _ = ctx.JSON(commons.ErrorCodeSystem) errMsg := fmt.Sprintf("错误信息: %s", err) // when stack finishes logMessage := fmt.Sprintf("从错误中回复:('%s')\n", ctx.HandlerName()) logMessage += errMsg + "\n" logMessage += fmt.Sprintf("\n%s", stacktrace) // 打印错误⽇志 ctx.Application().Logger().Warn(logMessage) } // 返回错误信息 ctx.StopExecution() } }() ctx.Next() } //应用层使用 func (this *articleService) FindArticlesByYearMonth(queryParam *commons.QueryParams, yearMonth string) (list []models.Article, paging *commons.Paging) { //时间转时间戳 t, err := time.ParseInLocation("2006-01", yearMonth, time.Local) if err != nil { panic(commons.ErrorCodeParse) } } package commons import ( "encoding/json" ) var ( ErrorCodeSystem = NewError(1000, "系统异常") ErrorCodeNotLogin = NewError(1, "请先登录") ErrorCodeParse = NewError(2, "解析错误") ErrorCodeNotFound = NewError(3, "未找到") ErrorCodeRegisterFailed = NewError(4, "用户注册失败") ) func NewError(code int, text string) *ErrorCode { return &ErrorCode{code, text, nil, false, nil} } func NewErrorData(code int, text string, errorData interface{}) *ErrorCode { return &ErrorCode{code, text, nil, false, errorData} } func FromError(err error) *ErrorCode { if err == nil { return nil } return &ErrorCode{0, err.Error(), nil, false, nil} } type ErrorCode struct { Code int Message string Data interface{} Success bool ErrorData interface{} } func (e *ErrorCode) Error() string { marshal, _ := json.Marshal(e) return string(marshal) }

开始订阅我的关于终生学习, 生产力以及知识管理的文章. 订阅后, 您将收到我的精选文章.

©2014-2024 Jimmy Lee. All rights reserved. 公众号: 技术管理方法论
Powered By My Lovely Children