Skip to content

Instantly share code, notes, and snippets.

@qszhu
Created April 25, 2021 06:43
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save qszhu/f49286e80a2a3fa7bc015237f7993579 to your computer and use it in GitHub Desktop.
Save qszhu/f49286e80a2a3fa7bc015237f7993579 to your computer and use it in GitHub Desktop.
go camp 1
  1. 我们在数据库操作的时候,比如 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
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment