errors

package
v0.2.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Mar 28, 2025 License: MIT, MIT Imports: 13 Imported by: 0

Documentation

Overview

Package errors is a fork of `github.com/go-errors/errors` that adds support for gRPC status codes, public messages, as well as stack-traces.

This is particularly useful when you want to understand the state of execution when an error was returned unexpectedly.

It provides the type *Error which implements the standard golang error interface, so you can use this library interchangably with code that is expecting a normal error return.

For example:

package crashy

import "github.com/go-errors/errors"

var Crashed = errors.Errorf("something really bad just happened")

func Crash() error {
    return errors.NewC(Crashed, codes.Internal).
			WithUserPresentableMessage("An unknown error occurred")
}

This can be called as follows:

package main

import (
    "crashy"
    "fmt"
    "github.com/go-errors/errors"
)

func main() {
    err := crashy.Crash()
    if err != nil {
        if errors.Is(err, crashy.Crashed) {
            fmt.Println(err.(*errors.Error).ErrorStack())
        } else {
            panic(err)
        }
    }
}

Index

Constants

This section is empty.

Variables

View Source
var MaxStackDepth = 50

The maximum number of stackframes on any error.

Functions

func As

func As(err error, target interface{}) bool

As finds the first error in err's tree that matches target, and if one is found, sets target to that error value and returns true. Otherwise, it returns false.

For more information see stdlib errors.As.

func Code

func Code(err error) codes.Code

Code returns a gRPC status code for an error. If the error is nil, it returns codes.OK. If error exposes a `Code()` method, it is returned. Otherwise codes.Internal is returned.

func Codef

func Codef(code codes.Code, format string, a ...interface{}) error

Codef creates a new error with the given message and status code.

func Errorf

func Errorf(format string, a ...interface{}) error

Errorf creates a new error with the given message. You can use it as a drop-in replacement for fmt.Errorf() to provide descriptive errors in return values.

func HTTPStatusCode

func HTTPStatusCode(err error) int

HTTPStatusCode returns an HTTP status code for an error. If the error is nil, it returns http.StatusOK. If error exposes a `HTTPStatusCode()` method, it is returned. Otherwise http.StatusInternalServerError is returned.

func Is

func Is(e error, original error) bool

Is detects whether the error is equal to a given error. Errors are considered equal by this function if they are matched by errors.Is or if their contained errors are matched through errors.Is.

func Join

func Join(errs ...error) error

Join returns an error that wraps the given errors. Any nil error values are discarded. Join returns nil if every value in errs is nil. The error formats as the concatenation of the strings obtained by calling the Error method of each element of errs, with a newline between each string.

A non-nil error returned by Join implements the Unwrap() []error method.

For more information see stdlib errors.Join.

func MaybeWrap

func MaybeWrap(e interface{}, skip int) error

MaybeWrap makes an Error from the given value. Nil is passed through safely to avoid nil pointer problems with the Error struct.

func Unwrap

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.

Unwrap only calls a method of the form "Unwrap() error". In particular Unwrap does not unwrap errors returned by Join.

For more information see stdlib errors.Unwrap.

Types

type Error

type Error struct {
	Err error
	// contains filtered or unexported fields
}

Error is an error with an attached stacktrace. It can be used wherever the builtin error interface is expected.

func Mark

func Mark(e interface{}, skip int) *Error

Mark takes an error and sets the stack trace from the point it was called, overriding any previous stack trace that may have been set. The skip parameter indicates how far up the stack to start the stacktrace. 0 is from the current call, 1 from its caller, etc.

func New

func New(e interface{}) *Error

New makes an Error from the given value. If that value is already an error then it will be used directly, if not, it will be passed to fmt.Errorf("%v"). The stacktrace will point to the line of code that called New.

func NewC

func NewC(e interface{}, code codes.Code) *Error

NewC makes an Error with a status code defined.

func ParsePanic

func ParsePanic(text string) (*Error, error)

ParsePanic allows you to get an error object from the output of a go program that panicked. This is particularly useful with https://github.com/mitchellh/panicwrap.

func ParseStack

func ParseStack(b []byte) (*Error, error)

ParseStack is intended to be used with the results of `debug.Stack` this is a hack for now and should be improved.

func WithCode

func WithCode(err error, code codes.Code) *Error

WithCode takes an error and adds a gRPC status code to it. If the error is not already an `Error`, it will be wrapped in one.

func WithDetails

func WithDetails(err error, details ...protoiface.MessageV1) *Error

WithDetails takes an error and adds gRPC details to it. If the error is not already an `Error`, it will be wrapped in one.

func WithHTTPStatusCode

func WithHTTPStatusCode(err error, code int) *Error

WithHTTPStatusCode takes an error and adds an explicit HTTP status code to it, overriding the HTTP status mapped from the gRPC code.

func WithUserPresentableMessage

func WithUserPresentableMessage(err error, userPresentableMessage string, args ...any) *Error

WithUserPresentableMessage takes an error message and adds a public message to it. If the error is not already an `Error`, it will be wrapped in one. The user presentable message is what Prefab will return to the client.

func Wrap

func Wrap(e interface{}, skip int) *Error

Wrap makes an Error from the given value. If that value is already an error then it will be used directly, if not, it will be passed to fmt.Errorf("%v"). The skip parameter indicates how far up the stack to start the stacktrace. 0 is from the current call, 1 from its caller, etc.

func WrapPrefix

func WrapPrefix(e interface{}, prefix string, skip int) *Error

WrapPrefix makes an Error from the given value. If that value is already an error then it will be used directly, if not, it will be passed to fmt.Errorf("%v"). The prefix parameter is used to add a prefix to the error message when calling Error(). The skip parameter indicates how far up the stack to start the stacktrace. 0 is from the current call, 1 from its caller, etc.

func (*Error) Append

func (err *Error) Append(str string) *Error

Append a message to the wrapped error.

func (*Error) Callers

func (err *Error) Callers() []uintptr

Callers satisfies the bugsnag ErrorWithCallerS() interface so that the stack can be read out.

func (*Error) Code

func (err *Error) Code() codes.Code

Code returns the gRPC status code associated with the error.

func (*Error) Details

func (err *Error) Details() []protoiface.MessageV1

Details returns the gRPC details associated with the error.

func (*Error) Error

func (err *Error) Error() string

Error returns the underlying error's message.

func (*Error) ErrorStack

func (err *Error) ErrorStack() string

ErrorStack returns a string that contains both the error message and the callstack.

func (*Error) GRPCStatus

func (err *Error) GRPCStatus() *status.Status

GRPCStatus returns a gRPC status object for the error.

func (*Error) HTTPStatusCode

func (err *Error) HTTPStatusCode() int

HTTPStatusCode returns the HTTP status code that should be returned to the client. If a code is set, it will be used, otherwise a default will be returned based on the gRPC code.

func (*Error) MinimalStack

func (err *Error) MinimalStack(skip, length int) []string

MinimalStack returns a minimal stack trace suitable for printing in logs.

func (*Error) Stack

func (err *Error) Stack() []byte

Stack returns the callstack formatted the same way that go does in runtime/debug.Stack().

func (*Error) StackFrames

func (err *Error) StackFrames() []StackFrame

StackFrames returns an array of frames containing information about the stack.

func (*Error) TypeName

func (err *Error) TypeName() string

TypeName returns the type this error. e.g. *errors.stringError.

func (*Error) Unwrap

func (err *Error) Unwrap() error

Unwrap the error (implements api for As function).

func (*Error) UserPresentableMessage

func (err *Error) UserPresentableMessage() string

UserPresentableMessage returns the error string that should be returned to the client.

func (*Error) WithCode

func (err *Error) WithCode(code codes.Code) *Error

WithCode sets the gRPC status code associated with the error.

func (*Error) WithDetails

func (err *Error) WithDetails(details ...protoiface.MessageV1) *Error

WithDetails sets the gRPC details associated with the error.

func (*Error) WithHTTPStatusCode

func (err *Error) WithHTTPStatusCode(code int) *Error

WithHTTPStatusCode sets the HTTP status code that should be returned to the client.

func (*Error) WithUserPresentableMessage

func (err *Error) WithUserPresentableMessage(userPresentableMessage string, args ...any) *Error

WithUserPresentableMessage sets the error string that should be returned to the client.

type StackFrame

type StackFrame struct {
	// The path to the file containing this ProgramCounter
	File string
	// The LineNumber in that file
	LineNumber int
	// The Name of the function that contains this ProgramCounter
	Name string
	// The Package that contains this function
	Package string
	// The underlying ProgramCounter
	ProgramCounter uintptr
}

A StackFrame contains all necessary information about to generate a line in a callstack.

func NewStackFrame

func NewStackFrame(pc uintptr) StackFrame

NewStackFrame popoulates a stack frame object from the program counter.

func (*StackFrame) Func

func (frame *StackFrame) Func() *runtime.Func

Func returns the function that contained this frame.

func (*StackFrame) SourceLine

func (frame *StackFrame) SourceLine() (string, error)

SourceLine gets the line of code (from File and Line) of the original source if possible.

func (*StackFrame) String

func (frame *StackFrame) String() string

String returns the stackframe formatted in the same way as go does in runtime/debug.Stack().

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL