Documentation
¶
Overview ¶
Package errors is heavily inspired by "github.com/pkg/errors"
Example (StackTrace) ¶
package main
import (
"fmt"
"github.com/VirtusLab/go-extended/pkg/errors"
)
func fn() error {
e1 := errors.New("error")
e2 := errors.Wrapf(e1, "inner")
e3 := errors.Wrapf(e2, "middle")
return errors.Wrapf(e3, "outer")
}
func main() {
err, ok := errors.Cause(fn()).(errors.WithStackTrace)
if !ok {
panic("oops, err does not implement stackTracer")
}
st := err.StackTrace()
fmt.Printf("%+v", st[0:2]) // top two frames
// Example output:
// github.com/VirtusLab/go-extended/pkg/errors_test.fn
// /home/dfc/src/github.com/VirtusLab/go-extended/pkg/errors/example_test.go:47
// github.com/VirtusLab/go-extended/pkg/errors_test.Example_stackTrace
// /home/dfc/src/github.com/VirtusLab/go-extended/pkg/errors/example_test.go:127
}
Index ¶
- func Cause(err error) error
- func Errorf(format string, args ...interface{}) error
- func FormatCauseAndStack(err error, f *Stack, s fmt.State, verb rune)
- func New(message string) error
- func Wrap(e error) error
- func Wrapf(e error, format string, args ...interface{}) error
- type Frame
- type Stack
- type StackTrace
- type WithCause
- type WithStackTrace
Examples ¶
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func Cause ¶
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.
Example ¶
package main
import (
"fmt"
"github.com/VirtusLab/go-extended/pkg/errors"
)
func fn() error {
e1 := errors.New("error")
e2 := errors.Wrapf(e1, "inner")
e3 := errors.Wrapf(e2, "middle")
return errors.Wrapf(e3, "outer")
}
func main() {
err := fn()
fmt.Println(err)
fmt.Println(errors.Cause(err))
}
Output: outer: middle: inner: error error
Example (Printf) ¶
package main
import (
"fmt"
"github.com/VirtusLab/go-extended/pkg/errors"
)
func main() {
err := errors.Wrapf(func() error {
return func() error {
//lint:ignore S1039 the test introduces it on purpose
return errors.Errorf("hello %s", fmt.Sprintf("world"))
}()
}(), "failed")
fmt.Printf("%v", err)
}
Output: failed: hello world
func Errorf ¶
Errorf returns a new error with the supplied formatted message and stack trace. It records the stack trace at the point it was called.
Example (Extended) ¶
package main
import (
"fmt"
"github.com/VirtusLab/go-extended/pkg/errors"
)
func main() {
err := errors.Errorf("whoops: %s", "foo")
fmt.Printf("%+v", err)
// Example output:
// whoops: foo
// github.com/VirtusLab/go-extended/pkg/errors_test.ExampleErrorf
// /home/dfc/src/github.com/VirtusLab/go-extended/pkg/errors/example_test.go:101
// testing.runExample
// /home/dfc/go/src/testing/example.go:114
// testing.RunExamples
// /home/dfc/go/src/testing/example.go:38
// testing.(*M).Run
// /home/dfc/go/src/testing/testing.go:744
// main.main
// /github.com/VirtusLab/go-extended/pkg/errors/_test/_testmain.go:102
// runtime.main
// /home/dfc/go/src/runtime/proc.go:183
// runtime.goexit
// /home/dfc/go/src/runtime/asm_amd64.s:2059
}
func FormatCauseAndStack ¶
FormatCauseAndStack helps to implement fmt.Formatter used by Sprint(f) or Fprint(f) etc. Use for custom error implementations with Cause and StackFormatter
Example ¶
package main
import (
"fmt"
"github.com/VirtusLab/go-extended/pkg/errors"
)
type ErrCustom struct {
stack *errors.Stack
s string
}
func (e *ErrCustom) Error() string {
return e.s
}
func (e *ErrCustom) Format(s fmt.State, verb rune) {
errors.FormatCauseAndStack(e, e.stack, s, verb)
}
func (e *ErrCustom) StackTrace() errors.StackTrace {
return e.stack.StackTrace()
}
func NewErrCustom(s string) *ErrCustom {
return &ErrCustom{
stack: errors.Callers(),
s: s,
}
}
func main() {
err := NewErrCustom("whoops")
fmt.Println(err)
}
Output: whoops
Example (Printf) ¶
package main
import (
"fmt"
"github.com/VirtusLab/go-extended/pkg/errors"
)
type ErrCustom struct {
stack *errors.Stack
s string
}
func (e *ErrCustom) Error() string {
return e.s
}
func (e *ErrCustom) Format(s fmt.State, verb rune) {
errors.FormatCauseAndStack(e, e.stack, s, verb)
}
func (e *ErrCustom) StackTrace() errors.StackTrace {
return e.stack.StackTrace()
}
func NewErrCustom(s string) *ErrCustom {
return &ErrCustom{
stack: errors.Callers(),
s: s,
}
}
func main() {
err := NewErrCustom("whoops")
fmt.Printf("%+v", err)
// Example output:
// whoops
// github.com/VirtusLab/go-extended/pkg/errors_test.ExampleFormatCauseAndStack_prints
// /home/dfc/go/src/github.com/VirtusLab/go-extended/pkg/errors/custom_test.go:41
// testing.runExample
// /home/dfc/go/src/testing/example.go:121
// testing.runExamples
// /home/dfc/go/src/testing/example.go:45
// testing.(*M).Run
// /home/dfc/go/src/testing/testing.go:1073
// main.main
// _testmain.go:108
// runtime.main
// /home/dfc/go/src/runtime/proc.go:200
// runtime.goexit
// /home/dfc/go/src/runtime/asm_amd64.s:1337
}
func New ¶
New returns a new error with the supplied message and a stack trace. It records the stack trace at the point it was called.
Example ¶
package main
import (
"fmt"
"github.com/VirtusLab/go-extended/pkg/errors"
)
func main() {
err := errors.New("whoops")
fmt.Println(err)
}
Output: whoops
Example (Printf) ¶
package main
import (
"fmt"
"github.com/VirtusLab/go-extended/pkg/errors"
)
func main() {
err := errors.New("whoops")
fmt.Printf("%+v", err)
// Example output:
// whoops
// github.com/VirtusLab/go-extended/pkg/errors_test.ExampleNew_printf
// /home/dfc/src/github.com/VirtusLab/go-extended/pkg/errors/example_test.go:17
// testing.runExample
// /home/dfc/go/src/testing/example.go:114
// testing.RunExamples
// /home/dfc/go/src/testing/example.go:38
// testing.(*M).Run
// /home/dfc/go/src/testing/testing.go:744
// main.main
// /github.com/VirtusLab/go-extended/pkg/errors/_test/_testmain.go:106
// runtime.main
// /home/dfc/go/src/runtime/proc.go:183
// runtime.goexit
// /home/dfc/go/src/runtime/asm_amd64.s:2059
}
func Wrap ¶
Wrap wraps a given error with a stack trace. Please note the error type will change when wrapped. It records the stack trace at the point it was called.
Example ¶
package main
import (
"fmt"
"github.com/VirtusLab/go-extended/pkg/errors"
)
func main() {
cause := errors.New("whoops")
err := errors.Wrap(cause)
fmt.Println(err)
}
Output: whoops
Example (Extended) ¶
package main
import (
"fmt"
"github.com/VirtusLab/go-extended/pkg/errors"
)
func fn() error {
e1 := errors.New("error")
e2 := errors.Wrapf(e1, "inner")
e3 := errors.Wrapf(e2, "middle")
return errors.Wrapf(e3, "outer")
}
func main() {
err := fn()
fmt.Printf("%+v\n", err)
// Example output:
// error
// github.com/VirtusLab/go-extended/pkg/errors_test.fn
// /home/dfc/src/github.com/VirtusLab/go-extended/pkg/errors/example_test.go:47
// github.com/VirtusLab/go-extended/pkg/errors_test.ExampleCause_printf
// /home/dfc/src/github.com/VirtusLab/go-extended/pkg/errors/example_test.go:63
// testing.runExample
// /home/dfc/go/src/testing/example.go:114
// testing.RunExamples
// /home/dfc/go/src/testing/example.go:38
// testing.(*M).Run
// /home/dfc/go/src/testing/testing.go:744
// main.main
// /github.com/VirtusLab/go-extended/pkg/errors/_test/_testmain.go:104
// runtime.main
// /home/dfc/go/src/runtime/proc.go:183
// runtime.goexit
// /home/dfc/go/src/runtime/asm_amd64.s:2059
// github.com/VirtusLab/go-extended/pkg/errors_test.fn
// /home/dfc/src/github.com/VirtusLab/go-extended/pkg/errors/example_test.go:48: inner
// github.com/VirtusLab/go-extended/pkg/errors_test.fn
// /home/dfc/src/github.com/VirtusLab/go-extended/pkg/errors/example_test.go:49: middle
// github.com/VirtusLab/go-extended/pkg/errors_test.fn
// /home/dfc/src/github.com/VirtusLab/go-extended/pkg/errors/example_test.go:50: outer
}
Example (Printf) ¶
package main
import (
"fmt"
"github.com/VirtusLab/go-extended/pkg/errors"
)
func main() {
cause := errors.New("whoops")
err := errors.Wrap(cause)
fmt.Printf("%+v", err)
// Example Output:
// whoops
// github.com/VirtusLab/go-extended/pkg/errors_test.ExampleWithStack_printf
// /home/fabstu/go/src/github.com/VirtusLab/go-extended/pkg/errors/example_test.go:55
// testing.runExample
// /usr/lib/go/src/testing/example.go:114
// testing.RunExamples
// /usr/lib/go/src/testing/example.go:38
// testing.(*M).Run
// /usr/lib/go/src/testing/testing.go:744
// main.main
// github.com/VirtusLab/go-extended/pkg/errors/_test/_testmain.go:106
// runtime.main
// /usr/lib/go/src/runtime/proc.go:183
// runtime.goexit
// /usr/lib/go/src/runtime/asm_amd64.s:2086
// github.com/VirtusLab/go-extended/pkg/errors_test.ExampleWithStack_printf
// /home/fabstu/go/src/github.com/VirtusLab/go-extended/pkg/errors/example_test.go:56
// testing.runExample
// /usr/lib/go/src/testing/example.go:114
// testing.RunExamples
// /usr/lib/go/src/testing/example.go:38
// testing.(*M).Run
// /usr/lib/go/src/testing/testing.go:744
// main.main
// github.com/VirtusLab/go-extended/pkg/errors/_test/_testmain.go:106
// runtime.main
// /usr/lib/go/src/runtime/proc.go:183
// runtime.goexit
// /usr/lib/go/src/runtime/asm_amd64.s:2086
}
func Wrapf ¶
Wrapf wraps a given error with a formatted message and a stack trace. Please note the error type will change when wrapped. It records the stack trace at the point it was called.
Example ¶
package main
import (
"fmt"
"github.com/VirtusLab/go-extended/pkg/errors"
)
func main() {
cause := errors.New("whoops")
err := errors.Wrapf(cause, "oh noes")
fmt.Println(err)
cause = errors.New("whoops")
err = errors.Wrapf(cause, "oh noes #%d", 2)
fmt.Println(err)
// Example output:
// oh noes: whoops
// oh noes #2: whoops
}
Types ¶
type Frame ¶
type Frame uintptr
Frame represents a program counter inside a stack frame. For historical reasons if Frame is interpreted as a uintptr its value represents the program counter + 1.
func (Frame) Format ¶
Format formats the frame according to the fmt.Formatter interface.
%s source file %d source line %n function name %v equivalent to %s:%d
Format accepts flags that alter the printing of some verbs, as follows:
%+s function name and path of source file relative to the compile time
GOPATH separated by \n\t (<funcName>\n\t<path>)
%+v equivalent to %+s:%d
func (Frame) MarshalText ¶
MarshalText formats a stacktrace Frame as a text string. The output is the same as that of fmt.Sprintf("%+v", f), but without newlines or tabs.
type Stack ¶
type Stack []uintptr
Stack represents a stack of program counters.
func (*Stack) StackTrace ¶
func (s *Stack) StackTrace() StackTrace
StackTrace creates a StackTrace for this Stack
type StackTrace ¶
type StackTrace []Frame
StackTrace is stack of Frames from innermost (newest) to outermost (oldest).
func (StackTrace) Format ¶
func (st StackTrace) Format(s fmt.State, verb rune)
Format formats the stack of Frames according to the fmt.Formatter interface.
%s lists source files for each Frame in the stack %v lists the source file and line number for each Frame in the stack
Format accepts flags that alter the printing of some verbs, as follows:
%+v Prints filename, function, and line number for each Frame in the stack.
type WithCause ¶
type WithCause interface {
// Cause returns the error that caused this error
Cause() error
}
WithCause represents an error that was caused by another error
type WithStackTrace ¶
type WithStackTrace interface {
// StackTrace returns a stack trace for this error
StackTrace() StackTrace
}
WithStackTrace represents an error with a stack trace