[Golang (Go) pkg] errors
errors
Package errors
implements functions to manipulate errors.
The New
function creates errors whose only content is a text message
The Unwrap
, Is
and As
functions work on errors that may wrap other errors.
Package
Import errors
package.
1 | import "errors" |
func New
1 | func New(text string) error |
New
returns an error that formats as the given text. Each call to New
returns a distinct error value even if the text is identical.
1 | // error message |
func Unwrap
1 | func Unwrap(err error) error |
Unwrap returns the result of calling the Unwrap
method on err, if err’s type contains an Unwrap
method returning error. Otherwise, Unwrap returns nil
.
If e.Unwrap()
returns a non-nil error w
, then we say that e
wraps w
.
A simple way to create wrapped errors is to call fmt.Errorf
and apply the %w
verb to the error argument:
1 | err := errors.New("error msg") |
returns err.
func Is
1 | func Is(err, target error) bool |
Is reports whether any error in err’s chain matches target.
The chain consists of err itself followed by the sequence of errors obtained by repeatedly calling Unwrap
.
An error is considered to match a target if it is equal to that target or if it implements a method Is(error) bool
such that Is(target)
returns true
.
An error type might provide an Is
method so it can be treated as equivalent to an existing error. For example, if MyError
defines
1 | func (m MyError) Is(target error) bool { return target == fs.ErrExist } |
then Is(MyError{}, fs.ErrExist)
returns true
. See syscall.Errno.Is
for an example in the standard library.
Is
unwraps its first argument sequentially looking for an error that matches the second. It reports whether it finds a match. It should be used in preference to simple equality checks:
1 | if errors.Is(err, fs.ErrExist) |
is preferable to
1 | if err == fs.ErrExist |
because the former will succeed if err wraps fs.ErrExist
.
1 | err := errors.New("error msg") |
func As
1 | func As(err error, target interface{}) bool |
As finds the first error in err’s chain that matches target, and if so, sets target to that error value and returns true
. Otherwise, it returns false
.
The chain consists of err itself followed by the sequence of errors obtained by repeatedly calling Unwrap
.
An error matches target if the error’s concrete value is assignable to the value pointed to by target, or if the error has a method As(interface{}) bool
such that As(target)
returns true
. In the latter case, the As method is responsible for setting target.
An error type might provide an As
method so it can be treated as if it were a different error type.
As
panics if target is not a non-nil pointer to either a type that implements error, or to any interface type.
1 | var perr *fs.PathError |
is preferable to
1 | if perr, ok := err.(*fs.PathError); ok { |
because the former will succeed if err wraps an *fs.PathError
.
References
[1] errors - The Go Programming Language - https://golang.org/pkg/errors/
[2] Working with Errors in Go 1.13 - The Go Blog - https://blog.golang.org/go1.13-errors