--- /dev/null
+/*
+Package errors implements a basic error wrapping pattern, so that errors can be
+annotated with additional information without losing the original error.
+
+Example:
+
+ import "chain/errors"
+
+ func query() error {
+ err := pq.Exec("SELECT...")
+ if err != nil {
+ return errors.Wrap(err, "select query failed")
+ }
+
+ err = pq.Exec("INSERT...")
+ if err != nil {
+ return errors.Wrap(err, "insert query failed")
+ }
+
+ return nil
+ }
+
+ func main() {
+ err := query()
+ if _, ok := errors.Root(err).(sql.ErrNoRows); ok {
+ log.Println("There were no results")
+ return
+ } else if err != nil {
+ log.Println(err)
+ return
+ }
+
+ log.Println("success")
+ }
+
+When to wrap errors
+
+Errors should be wrapped with additional messages when the context is ambiguous.
+This includes when the error could arise in multiple locations in the same
+function, when the error is very common and likely to appear at different points
+in the call tree (e.g., JSON serialization errors), or when you need specific
+parameters alongside the original error message.
+
+Error handling best practices
+
+Errors are part of a function's interface. If you expect the caller to perform
+conditional error handling, you should document the errors returned by your
+function in a function comment, and include it as part of your unit tests.
+
+Be disciplined about validating user input. Programs should draw a very clear
+distinction between user errors and internal errors.
+
+Avoid redundant error logging. If you return an error, assume it will be logged
+higher up the call stack. For a given project, choose an appropriate layer to
+handle error logging.
+*/
+package errors