go-errors
Why this repo was created?
Main reason was to create additional methods for better error typing support.
Features
- Errors as constants
errors.Is
support
Wrap
method to wrap original error with errors.Unwrap
method
String.New
support to add context arguments for error message, while errors.Is
still compares error itself
Error.WithStack
support to store stack trace at time method called
Show me the code
https://play.golang.org/p/U2lC-yC2YIb
package main
import (
"errors"
"log"
serr "github.com/bdandy/go-errors"
)
const ErrSomeFunc = serr.String("somefunc for %s failed")
func someFunc() error {
return errors.New("io error")
}
func funcWithArgs(args ...interface{}) error {
err := someFunc()
if err != nil {
return ErrSomeFunc.New(args...).Wrap(err)
}
return nil
}
func main() {
err := funcWithArgs("tryme!")
// handle ErrSomeFunc error type
if errors.Is(err, ErrSomeFunc) {
log.Print("typedError handled: ", err)
} else if err != nil {
log.Print("other error cases:", err)
}
}
Benchmark
Comparsion with errors.Errorf
and pkg/errors
goos: linux
goarch: amd64
pkg: github.com/bdandy/go-errors
cpu: Intel(R) Core(TM) i7-1065G7 CPU @ 1.30GHz
BenchmarkWrap-8 5007164 270.9 ns/op 136 B/op 6 allocs/op
BenchmarkWrapWithStack-8 1232276 947.3 ns/op 392 B/op 7 allocs/op
BenchmarkErrorfWrap-8 4218820 284.9 ns/op 64 B/op 3 allocs/op
BenchmarkPkgErrorWrap-8 1376254 858.2 ns/op 368 B/op 6 allocs/op
BenchmarkPkgErrorWrapWithStack-8 781378 1593 ns/op 672 B/op 9 allocs/op
PASS