diff --git a/errors.go b/errors.go index 32d5b4a..360a51f 100644 --- a/errors.go +++ b/errors.go @@ -211,6 +211,14 @@ func (x *Error) ID(id string) *Error { return x } +// Clone creates a new error extends receiver error's info +// No side effect to receiver +func (x *Error) Clone() *Error { + err := newError() + x.copy(err) + return err +} + // Wrap creates a new Error and copy message and id to new one. func (x *Error) Wrap(cause error) *Error { err := newError() diff --git a/examples/logging_with_zap/main.go b/examples/logging_with_zap/main.go index 4c97c04..c0b7e83 100644 --- a/examples/logging_with_zap/main.go +++ b/examples/logging_with_zap/main.go @@ -28,11 +28,20 @@ func main() { }, } - err := goerr.Wrap(errors.New("some error")).WithValue("key", "value").WithValue("num_key", 1).WithValue("struct", st) + err := goerr.Wrap(errors.New("some error")). + WithValue("key", "value"). + WithValue("num_key", 1). + WithValue("struct", st) if goErr := goerr.Unwrap(err); goErr != nil { log.Printf("%s\n", goErr.LogValue()) } logger.Error("something happening", zap.Object("error", err)) + + if goErr := goerr.Unwrap(err); goErr != nil { + err2 := goErr.Clone() + err2 = err2.WithValue("___2", "This is err2") + logger.Error("something happening2", zap.Object("error2", err2)) + } }