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()
}
浙公网安备 33010602011771号