Documentation
¶
Overview ¶
Package go-xerrors is a simple, idiomatic, lightweight Go package that provides utilities for error handling. It offers functions and types to support stack traces, multi-errors, and simplified panic handling. The package is compatible with Go's standard error handling mechanisms, such as errors.As, errors.Is, and errors.Unwrap, including features from Go 1.13 and 1.20.
Index ¶
- Variables
- func Append(err error, errs ...error) error
- func Fprint(w io.Writer, err error) (int, error)
- func FromRecover(r any) error
- func Join(vals ...any) error
- func Joinf(format string, args ...any) error
- func Message(msg string) error
- func Messagef(format string, args ...any) error
- func New(vals ...any) error
- func Newf(format string, args ...any) error
- func Print(err error)
- func Recover(fn func(err error))
- func Sprint(err error) string
- func WithStackTrace(err error, skip int) error
- type Callers
- type DetailedError
- type Frame
- type PanicError
Constants ¶
This section is empty.
Variables ¶
var DefaultCallersFormatter = func(c Callers, w io.Writer) { for _, frame := range c.Frames() { io.WriteString(w, "at ") frame.writeFrame(w) io.WriteString(w, "\n") } }
DefaultCallersFormatter is the default formatter for Callers.
var DefaultFrameFormatter = func(f Frame, w io.Writer) { io.WriteString(w, shortname(f.Function)) io.WriteString(w, " (") io.WriteString(w, f.File) io.WriteString(w, ":") io.WriteString(w, strconv.Itoa(f.Line)) io.WriteString(w, ")") }
DefaultFrameFormatter is the default formatter for Frame.
Functions ¶
func Append ¶
Append appends the provided errors to an existing error or list of errors. If `err` is not a [multiError], it will be converted into one. Nil errors are ignored. It does not record a stack trace.
If the resulting error list is empty, nil is returned. If the resulting error list contains only one error, that error is returned instead of the list.
The returned error is compatible with Go errors, supporting errors.Is, errors.As, and the Go 1.20 `Unwrap() []error` method.
To create a chained error, use New, Newf, Join, or Joinf instead.
func Fprint ¶
Fprint writes a formatted error to the provided io.Writer.
If the error implements the DetailedError interface and returns a non-empty string, the returned details are added to each error in the chain.
The formatted error can span multiple lines and always ends with a newline.
func FromRecover ¶
FromRecover converts the result of the built-in `recover()` into an error with a stack trace. The returned error implements PanicError. Returns nil if `r` is nil.
This function must be called in the same function as `recover()` to ensure the stack trace is accurate.
func Join ¶ added in v1.0.0
Join joins multiple values into a single error, forming a chain of errors.
Conversion rules for arguments:
- If the value is an error, it is used as is.
- If the value is a string, a new error with that message is created.
- If the value implements fmt.Stringer, the result of String() is used to create an error.
- If the value is nil, it is ignored.
- Otherwise, the result of fmt.Sprint is used to create an error.
If called with no arguments or only nil values, Join returns nil.
To create a multi-error instead of an error chain, use Append.
func Joinf ¶ added in v1.0.0
Joinf joins multiple values into a single error with a formatted message, forming an error chain. The format string follows the conventions of fmt.Errorf.
Unlike errors created by fmt.Errorf, the Unwrap method on the returned error yields the next wrapped error, not a slice of errors, since this function is intended for creating linear error chains.
To create a multi-error instead of an error chain, use Append.
func Message ¶
Message creates a simple error with the given message, without recording a stack trace. Each call returns a distinct error instance, even if the message is identical.
This function is useful for creating sentinel errors, often referred to as "constant errors."
To create an error with a stack trace, use New or Newf instead.
func Messagef ¶ added in v1.0.0
Messagef creates a simple error with a formatted message, without recording a stack trace. The format string follows the conventions of fmt.Sprintf. Each call returns a distinct error instance, even if the message is identical.
This function is useful for creating sentinel errors, often referred to as "constant errors."
To create an error with a stack trace, use New or Newf instead.
func New ¶
New creates a new error from the provided values and records a stack trace at the point of the call. If multiple values are provided, each value is wrapped by the previous one, forming a chain of errors.
Usage examples:
- Add a stack trace to an existing error: New(err)
- Create an error with a message and a stack trace: New("access denied")
- Wrap an error with a message: New("access denied", io.EOF)
- Add context to a sentinel error: New(ErrReadError, "access denied")
Conversion rules for arguments:
- If the value is an error, it is used as is.
- If the value is a string, a new error with that message is created.
- If the value implements fmt.Stringer, the result of String() is used to create an error.
- If the value is nil, it is ignored.
- Otherwise, the result of fmt.Sprint is used to create an error.
If called with no arguments or only nil values, New returns nil.
To create a sentinel error, use Message or Messagef instead.
func Newf ¶ added in v1.0.0
Newf creates a new error with a formatted message and records a stack trace at the point of the call. The format string follows the conventions of fmt.Errorf.
Unlike errors created by fmt.Errorf, the Unwrap method on the returned error yields the next wrapped error, not a slice of errors, since this function is intended for creating linear error chains.
To create a sentinel error, use Message or Messagef instead.
func Print ¶
func Print(err error)
Print writes a formatted error to stderr.
If the error implements the DetailedError interface and returns a non-empty string, the returned details are added to each error in the chain.
The formatted error can span multiple lines and always ends with a newline.
func Recover ¶
func Recover(fn func(err error))
Recover wraps the built-in `recover()` function, converting the recovered value into an error with a stack trace. The provided `fn` callback is only invoked when a panic occurs. The error passed to `fn` implements PanicError.
This function must always be used directly with the `defer` keyword; otherwise, it will not function correctly.
func Sprint ¶
Sprint returns a formatted error as a string.
If the error implements the DetailedError interface and returns a non-empty string, the returned details are added to each error in the chain.
The formatted error can span multiple lines and always ends with a newline.
func WithStackTrace ¶
WithStackTrace wraps the provided error with a stack trace, capturing the stack at the point of the call. The `skip` argument specifies how many stack frames to skip.
If err is nil, WithStackTrace returns nil.
Types ¶
type Callers ¶
type Callers []uintptr
Callers represents a list of program counters from the runtime.Callers function.
func StackTrace ¶
StackTrace extracts the stack trace from the provided error. It traverses the error chain, looking for the last error that has a stack trace.
func (Callers) Format ¶
Format implements the fmt.Formatter interface.
Supported verbs:
- %s complete stack trace
- %v same as %s; '+' or '#' flags print struct details
- %q double-quoted Go string, same as %s
func (Callers) Frames ¶
Frames returns a slice of Frame structs with function, file, and line information.
func (Callers) String ¶
String implements the fmt.Stringer interface.
type DetailedError ¶
type DetailedError interface {
error
// ErrorDetails returns additional details about the error. It should not
// repeat the error message and should end with a newline.
//
// An empty string is returned if the error does not provide
// additional details.
ErrorDetails() string
}
DetailedError represents an error that provides additional details beyond the error message.
type Frame ¶
Frame represents a single stack frame with file, line, and function details.
func (Frame) Format ¶
Format implements the fmt.Formatter interface.
Supported verbs:
- %s function, file, and line number in a single line
- %f filename
- %d line number
- %n function name, with '+' flag adding the package name
- %v same as %s; '+' or '#' flags print struct details
- %q double-quoted Go string, same as %s
type PanicError ¶ added in v1.0.0
PanicError represents an error that occurs during a panic. It is returned by the Recover and FromRecover functions. It provides access to the original panic value via the [Panic] method.