golang sql.ErrNoRows是否应该抛给上层

2022年7月20日 373点热度 0人点赞 0条评论



在Go进阶训练营的error专题中,有道作业:

我们在数据库操作的时候,比如 dao 层中当遇到一个 sql.ErrNoRows 的时候,是否应该 Wrap 这个 error,抛给上层。为什么,应该怎么做请写出代码?


这里其实包含两个问题。

问题一:sql.ErrNoRows要不要往上抛?

问题二:如果sql.ErrNoRows抛给上层,是否应该包装这个error?





1. 是否抛给上层?我的答案:是


假设ErrNoRows不抛给上层,上层需要对result本身进行判断是否可用,而这不是我们习以为常的操作,忘记判断有可能引起空指针错误。


golang中编写规范是要求要处理error的,上层在使用result之前要判断err再确定result是否可用,这才是我们惯用的做法。所以我的理解是应该抛给上层。

func main() {  // 通过err判断result是否可用;  // 如果查询不到记录不算错误,后续使用result有可能出现空指针错误  result, err := query()  if err != nil {    log.Printf("%+v", err)    return  }
log.Println(result)}


2. 是否wrap?我的答案:是

在sql.go中ErrNoRows其实就是error.errorString,本身不包含堆栈信息。为了方便分析问题,我们应该对根因进行包装,保存其堆栈信息后抛给上层。

// ErrNoRows is returned by Scan when QueryRow doesn't return a// row. In such a case, QueryRow returns a placeholder *Row value that// defers this error until a Scan.var ErrNoRows = errors.New("sql: no rows in result set")

  

3. 总结

以上是我个人的理解,不一定是正确的,有不同想法的可以在评论区留言。

54290golang sql.ErrNoRows是否应该抛给上层

这个人很懒,什么都没留下

文章评论