- 我们在数据库操作的时候,比如 dao 层中当遇到一个 sql.ErrNoRows 的时候,是否应该 Wrap 这个 error,抛给上层。为什么,应该怎么做请写出代码?
sql.ErrNoRows
是一个 sentinel error。
如果不Wrap这个Error,那么这个Error就直接被暴露到了上层。
比如dao层之后换了数据库实现,可能会抛出另一种Error,那么上层调用dao的地方就都需要改动了。
- 使用
pkg/errors
errors.Wrap(err, "not found")
然后就能作为 opaque errors 来使用
- 使用 go 1.13 errors
fmt.Errorf("not found: %w", err)
但这样检查error的时候依旧会与 sentinel error 比较。所以用自定义类型来封装,并通过Unwrap()
返回 root cause
type DataNotFoundError struct {
err error
msg string
}
func (e *DataNotFoundError) Error() string {
return e.msg + ":" + e.err.Error()
}
func (e *DataNotFoundError) Unwrap() error {
return e.err
}