【发布时间】:2018-11-10 17:25:06
【问题描述】:
我正在使用 gin 编写一个简单的 REST API。我已经阅读了许多关于在 go 中减少错误处理重复性的帖子和文本,但我似乎无法完全理解如何在 gin 处理程序中执行此操作。
我的服务所做的只是对数据库运行一些查询并将结果作为 JSON 返回,因此典型的处理程序如下所示
func DeleteAPI(c *gin.Context) {
var db = c.MustGet("db").(*sql.DB)
query := "DELETE FROM table WHERE some condition"
tx, err := db.Begin()
if err != nil {
c.JSON(400, gin.H{"error": err.Error()})
return
}
defer tx.Rollback()
result, err := tx.Exec(query)
if err != nil {
c.JSON(400, gin.H{"error": err.Error()})
return
}
num, err := result.RowsAffected()
if err != nil {
c.JSON(400, gin.H{"error": err.Error()})
return
}
err = tx.Commit()
if err != nil {
c.JSON(400, gin.H{"error": err.Error()})
return
}
c.JSON(200, gin.H{"deleted": num})
}
如您所见,即使是这个简单的处理程序也会重复相同的“if err != nil”模式四次。在基于“选择”的 API 中,我有两倍的 API,因为在绑定输入数据时可能会出现错误,而在将响应编组为 JSON 时会出现错误。有没有好办法让这个更干?
【问题讨论】:
-
这是设计使然。 Go 很冗长。您可以像 Adrian 那样提取逻辑,但没有什么神奇的结构可以避免
if err != nil -
似乎有很多关于使用 golang 错误的接口特性和管理中间件中 Web 服务的错误处理的建议,但我不确定如何将这些应用于 gin。跨度>
-
没有一个很好的方法来处理中间件中的错误。处理程序不会返回错误,因此唯一的方法是恐慌/恢复,这是一种处理此类错误的可怕方法。
-
我有点想知道为什么在 go 社区中不赞成恐慌/恢复。不使用的原因是什么?
-
@MadWombat:阅读this。但是 TL;DR; 异常为错误(或 Go 中的恐慌)是一种解决过时语言限制的方法,不适用于 Go(或许多其他现代语言)。跨度>