如果有任何错误,我想中止状态和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() } |
- 有什么问题
- 问题通常在页面顶部的问题内部。
如文档中所述,
错误检查是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)) |