如何在 Golang Gin 中显示自定义错误和中止

Ram*_*Ram 6 go

如果有任何错误,我想中止状态和 json 正文。我不想一遍又一遍地使用重复的 if 条件。

f, err := os.Create(file)

if(err != nil){
  c.JSON(200, gin.H{"error": true,"message":err.Error() })
  return
}
Run Code Online (Sandbox Code Playgroud)
f, err := os.Create(file)
Error(c,err)
Run Code Online (Sandbox Code Playgroud)

但这个功能并没有中止

func Error(c *gin.Context,err error) {
  if(err != nil){
  c.JSON(200, gin.H{"status": false,"message":err.Error() })
  c.Error(err)
  c.Abort()
}
Run Code Online (Sandbox Code Playgroud)

mko*_*iva 9

Abort,如文档中所述,用于中止中间件链,而不是停止当前处理程序的执行。

错误检查是Go 的一个特性,你只需要像其他人一样去做。

但是,您可以在一定程度上简化错误检查。例如,一种解决方案可能是这样的:

func Error(c *gin.Context, err error) bool {
    if err != nil {
        c.Error(err)
        c.AbortWithStatusJSON(200, gin.H{"status": false, "message": err.Error()})
        return true // signal that there was an error and the caller should return
    }
    return false // no error, can continue
}
Run Code Online (Sandbox Code Playgroud)

然后你的处理程序看起来像这样:

func MyHandler(c *gin.Context) {
    f, err := os.Create(file)
    if Error(c, err) {
        return // exit
    }

    // continue
}
Run Code Online (Sandbox Code Playgroud)

另一种方法,在我看来更惯用的方法是将处理程序更改为具有错误返回参数,然后使用一个包装器来接受这些错误返回处理程序并返回一个有效的 gin 处理程序,然后这个返回的 gin 处理程序可以处理您认为合适的错误值。

// error returning handler
func MyHandler(c *gin.Context) error {
    f, err := os.Create(file)
    if err != nil {
        return err // exit
    }

    // do other stuff...

    return nil // all good
}

// function that turns the error-returning handler into a valid gin handler
func GinHandler(myhandler func(c *gin.Context) error) (ginhandler func(c *gin.Context)) {
    return func(c *gin.Context) {
        if err := myhandler(c); err != nil {
            c.Error(err)
            c.AbortWithStatusJSON(200, gin.H{"status": false, "message": err.Error()})
        }
    }
}

// and you would register the MyHandler like so...
router := gin.Default()
router.GET("/foobar", GinHandler(MyHandler))
Run Code Online (Sandbox Code Playgroud)