Source File
errors.go
Belonging Package
github.com/pkg/errors
// Package errors provides simple error handling primitives.
//
// The traditional error handling idiom in Go is roughly akin to
//
// if err != nil {
// return err
// }
//
// which when applied recursively up the call stack results in error reports
// without context or debugging information. The errors package allows
// programmers to add context to the failure path in their code in a way
// that does not destroy the original value of the error.
//
// Adding context to an error
//
// The errors.Wrap function returns a new error that adds context to the
// original error by recording a stack trace at the point Wrap is called,
// together with the supplied message. For example
//
// _, err := ioutil.ReadAll(r)
// if err != nil {
// return errors.Wrap(err, "read failed")
// }
//
// If additional control is required, the errors.WithStack and
// errors.WithMessage functions destructure errors.Wrap into its component
// operations: annotating an error with a stack trace and with a message,
// respectively.
//
// Retrieving the cause of an error
//
// Using errors.Wrap constructs a stack of errors, adding context to the
// preceding error. Depending on the nature of the error it may be necessary
// to reverse the operation of errors.Wrap to retrieve the original error
// for inspection. Any error value which implements this interface
//
// type causer interface {
// Cause() error
// }
//
// can be inspected by errors.Cause. errors.Cause will recursively retrieve
// the topmost error that does not implement causer, which is assumed to be
// the original cause. For example:
//
// switch err := errors.Cause(err).(type) {
// case *MyError:
// // handle specifically
// default:
// // unknown error
// }
//
// Although the causer interface is not exported by this package, it is
// considered a part of its stable public interface.
//
// Formatted printing of errors
//
// All error values returned from this package implement fmt.Formatter and can
// be formatted by the fmt package. The following verbs are supported:
//
// %s print the error. If the error has a Cause it will be
// printed recursively.
// %v see %s
// %+v extended format. Each Frame of the error's StackTrace will
// be printed in detail.
//
// Retrieving the stack trace of an error or wrapper
//
// New, Errorf, Wrap, and Wrapf record a stack trace at the point they are
// invoked. This information can be retrieved with the following interface:
//
// type stackTracer interface {
// StackTrace() errors.StackTrace
// }
//
// The returned errors.StackTrace type is defined as
//
// type StackTrace []Frame
//
// The Frame type represents a call site in the stack trace. Frame supports
// the fmt.Formatter interface that can be used for printing information about
// the stack trace of this error. For example:
//
// if err, ok := err.(stackTracer); ok {
// for _, f := range err.StackTrace() {
// fmt.Printf("%+s:%d\n", f, f)
// }
// }
//
// Although the stackTracer interface is not exported by this package, it is
// considered a part of its stable public interface.
//
// See the documentation for Frame.Format for more details.
package errors
import (
)
// New returns an error with the supplied message.
// New also records the stack trace at the point it was called.
func ( string) error {
return &fundamental{
msg: ,
stack: callers(),
}
}
// Errorf formats according to a format specifier and returns the string
// as a value that satisfies error.
// Errorf also records the stack trace at the point it was called.
func ( string, ...interface{}) error {
return &fundamental{
msg: fmt.Sprintf(, ...),
stack: callers(),
}
}
// fundamental is an error that has a message and a stack, but no caller.
type fundamental struct {
msg string
*stack
}
func ( *fundamental) () string { return .msg }
func ( *fundamental) ( fmt.State, rune) {
switch {
case 'v':
if .Flag('+') {
io.WriteString(, .msg)
.stack.Format(, )
return
}
fallthrough
case 's':
io.WriteString(, .msg)
case 'q':
fmt.Fprintf(, "%q", .msg)
}
}
// WithStack annotates err with a stack trace at the point WithStack was called.
// If err is nil, WithStack returns nil.
func ( error) error {
if == nil {
return nil
}
return &withStack{
,
callers(),
}
}
type withStack struct {
error
*stack
}
func ( *withStack) () error { return .error }
// Unwrap provides compatibility for Go 1.13 error chains.
func ( *withStack) () error { return .error }
func ( *withStack) ( fmt.State, rune) {
switch {
case 'v':
if .Flag('+') {
fmt.Fprintf(, "%+v", .Cause())
.stack.Format(, )
return
}
fallthrough
case 's':
io.WriteString(, .Error())
case 'q':
fmt.Fprintf(, "%q", .Error())
}
}
// Wrap returns an error annotating err with a stack trace
// at the point Wrap is called, and the supplied message.
// If err is nil, Wrap returns nil.
func ( error, string) error {
if == nil {
return nil
}
= &withMessage{
cause: ,
msg: ,
}
return &withStack{
,
callers(),
}
}
// Wrapf returns an error annotating err with a stack trace
// at the point Wrapf is called, and the format specifier.
// If err is nil, Wrapf returns nil.
func ( error, string, ...interface{}) error {
if == nil {
return nil
}
= &withMessage{
cause: ,
msg: fmt.Sprintf(, ...),
}
return &withStack{
,
callers(),
}
}
// WithMessage annotates err with a new message.
// If err is nil, WithMessage returns nil.
func ( error, string) error {
if == nil {
return nil
}
return &withMessage{
cause: ,
msg: ,
}
}
// WithMessagef annotates err with the format specifier.
// If err is nil, WithMessagef returns nil.
func ( error, string, ...interface{}) error {
if == nil {
return nil
}
return &withMessage{
cause: ,
msg: fmt.Sprintf(, ...),
}
}
type withMessage struct {
cause error
msg string
}
func ( *withMessage) () string { return .msg + ": " + .cause.Error() }
func ( *withMessage) () error { return .cause }
// Unwrap provides compatibility for Go 1.13 error chains.
func ( *withMessage) () error { return .cause }
func ( *withMessage) ( fmt.State, rune) {
switch {
case 'v':
if .Flag('+') {
fmt.Fprintf(, "%+v\n", .Cause())
io.WriteString(, .msg)
return
}
fallthrough
case 's', 'q':
io.WriteString(, .Error())
}
}
// Cause returns the underlying cause of the error, if possible.
// An error value has a cause if it implements the following
// interface:
//
// type causer interface {
// Cause() error
// }
//
// If the error does not implement Cause, the original error will
// be returned. If the error is nil, nil will be returned without further
// investigation.
func ( error) error {
type interface {
() error
}
for != nil {
, := .()
if ! {
break
}
= .()
}
return
}
![]() |
The pages are generated with Golds v0.6.7. (GOOS=linux GOARCH=amd64) Golds is a Go 101 project developed by Tapir Liu. PR and bug reports are welcome and can be submitted to the issue list. Please follow @Go100and1 (reachable from the left QR code) to get the latest news of Golds. |