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

1
2
3
4
5
6
f, err := os.Create(file)

if(err != nil){
  c.JSON(200, gin.H{"error": true,"message":err.Error() })
  return
}
1
2
f, err := os.Create(file)
Error(c,err)

但是此功能不会中止

1
2
3
4
5
6
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()
}
  • 有什么问题
  • 问题通常在页面顶部的问题内部。

如文档中所述,

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

错误检查是Go的功能,您只需要做一下,就和其他所有人一样。

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

1
2
3
4
5
6
7
8
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
}

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

1
2
3
4
5
6
7
8
func MyHandler(c *gin.Context) {
    f, err := os.Create(file)
    if Error(c, err) {
        return // exit
    }

    // continue
}

另一种方法,在我看来是更惯用的一种方法,是将处理程序更改为具有错误返回参数,然后具有package器,该package器采用这些返回错误的处理程序并返回有效的gin处理程序,然后返回杜松子酒处理程序可以处理错误值,但是您认为合适。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
// 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))