如果有任何错误,我想中止状态和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()
}
答案 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))