在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. 总结
以上是我个人的理解,不一定是正确的,有不同想法的可以在评论区留言。
文章评论