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

时间:2019-09-07 21:29:28

标签: go

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

f, err := os.Create(file)

if(err != nil){
  c.JSON(200, gin.H{"error": true,"message":err.Error() })
  return
}

f, err := os.Create(file)
Error(c,err)

但此功能不会中止

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()
}

1 个答案:

答案 0 :(得分:2)

如文档中所述,

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
}

然后您的处理程序将如下所示:

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

    // continue
}

另一种方法,在我看来是更惯用的一种方法,是将处理程序更改为具有错误返回参数,然后具有一个包装器,该包装器使用这些返回错误的处理程序并返回有效的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))