gin: 抛出自异常和捕捉异常处理,panic/recover

一,自定义异常

global/customError.go

package global

// 自定义错误类型
type CustomError struct {
	Code    int
	Error    error
}

二,抛出异常

我们在gorm的自定义log中已经处理过数据库的异常,所以在查询遇到error时用panic抛出自定义异常

service/articleService.go

//select一个article
func GetOneArticleById(c *gin.Context,id int) (*model.ArticleModel, error) {
	fields := []string{"id", "title","demo","content"}
	articleOne:=&model.ArticleModel{}

	err := global.DBLink.WithContext(c).Select(fields).Where("id=?",id).First(&articleOne).Error
	fmt.Println("--------------GetOneArticleById:",err)
	if (err != nil) {
		fmt.Println("service:发生了错误:")
		fmt.Println(err)
		panic(global.CustomError{Code: 1500, Error: err})
		return nil,err
	} else {
		return articleOne,nil
	}
}

 

三,gin对异常的捕捉处理

routes/routes.go

func Routes() *gin.Engine {
	router := gin.Default()

	//处理找不到路由
	router.NoRoute(HandleNotFound)
	router.NoMethod(HandleNotFound)
    //处理发生异常
	router.Use(Recover)
    ...
}

//500,内部发生异常时的处理
func Recover(c *gin.Context) {
	defer func() {
		if err := recover(); err != nil {

			//判断类型,如果是自定义的数据库错误,无需写日志,直接返回
			if customError, ok := err.(global.CustomError); ok {
				fmt.Println("转换自定义异常类型成功")
				if customError.Code == 1500 {
					//是自定义异常,直接返回
					//fmt.Printf("Handled custom error: %s\n", customError.Error)
					global.NewResult(c).ErrorCode(500,"服务器数据错误:"+customError.Error.Error(),nil)
					return
				} else {
					// todo
				}
			}

            //记录日志等
			
            //返回报错
			global.NewResult(c).ErrorCode(500,"服务器内部错误",nil)
			return
		}
	}()
	//继续后续接口调用
	c.Next()
}

 

posted @ 2025-02-09 19:17  刘宏缔的架构森林  阅读(129)  评论(0)    收藏  举报