add Wrap(), Base(), HasTrace()

This commit is contained in:
Alex Grintsvayg 2018-01-08 16:05:26 -05:00
parent a8fd5b2cbd
commit 825e9a1235

View file

@ -1,11 +1,17 @@
package errors package errors
import ( import (
base "errors"
"fmt" "fmt"
"github.com/go-errors/errors" "github.com/go-errors/errors"
) )
// interop with pkg/errors
type causer interface {
Cause() error
}
// Err intelligently creates/handles errors, while preserving the stack trace. // Err intelligently creates/handles errors, while preserving the stack trace.
// It works with errors from github.com/pkg/errors too. // It works with errors from github.com/pkg/errors too.
func Err(err interface{}, fmtParams ...interface{}) error { func Err(err interface{}, fmtParams ...interface{}) error {
@ -13,10 +19,6 @@ func Err(err interface{}, fmtParams ...interface{}) error {
return nil return nil
} }
type causer interface {
Cause() error
}
if _, ok := err.(causer); ok { if _, ok := err.(causer); ok {
err = fmt.Errorf("%+v", err) err = fmt.Errorf("%+v", err)
} else if errString, ok := err.(string); ok && len(fmtParams) > 0 { } else if errString, ok := err.(string); ok && len(fmtParams) > 0 {
@ -26,6 +28,19 @@ func Err(err interface{}, fmtParams ...interface{}) error {
return errors.Wrap(err, 1) return errors.Wrap(err, 1)
} }
// Wrap calls errors.Wrap, in case you want to skip a different amount
func Wrap(err interface{}, skip int) *errors.Error {
if err == nil {
return nil
}
if _, ok := err.(causer); ok {
err = fmt.Errorf("%+v", err)
}
return errors.Wrap(err, skip+1)
}
// Is compares two wrapped errors to determine if the underlying errors are the same // Is compares two wrapped errors to determine if the underlying errors are the same
func Is(e error, original error) bool { func Is(e error, original error) bool {
return errors.Is(e, original) return errors.Is(e, original)
@ -44,14 +59,24 @@ func Trace(err error) string {
if err == nil { if err == nil {
return "" return ""
} }
return string(errors.Wrap(Err(err), 0).Stack()) return string(Err(err).(*errors.Error).Stack())
} }
// FullTrace returns the error type, message, and stack trace // FullTrace returns the error type, message, and stack trace
func FullTrace(err error) string { func FullTrace(err error) string {
if err == nil { if err == nil {
return "" return ""
} }
return errors.Wrap(Err(err), 0).ErrorStack() return Err(err).(*errors.Error).ErrorStack()
}
// Base returns a simple error with no stack trace attached
func Base(text string) error {
return base.New(text)
}
// HasTrace checks if error has a trace attached
func HasTrace(err error) bool {
_, ok := err.(*errors.Error)
return ok
} }