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 errorsimport ()// 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}fallthroughcase '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}fallthroughcase '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 errormsg 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}fallthroughcase '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. |