package err import ( "fmt" "runtime/debug" ) type Err struct { errorWithStack string } func (err Err) Error() string { return err.errorWithStack } func createError(msg string, stack []byte) error { return &Err{fmt.Sprintf("%s\n%s", msg, string(stack))} } func NewError(err interface{}) error { if err == nil { return nil } stack := debug.Stack() switch v := err.(type) { case string: return createError(v, stack) case *Err: return v case Err: return v case error: return createError(v.Error(), stack) } return NewError("Unrecognized error type....") } func NewErrorf(format string, a ...interface{}) error { stack := debug.Stack() return createError(fmt.Sprintf(format, a), stack) }