Comments (7)
Oh, this might be the source of the confusion: Wrap(…)
returns a &withStack{ &withMessage{ … } }
and so when one calls Unwrap()
on it, one gets the &withMessage{ … }
rather than the original message that was put into Wrap(…)
, which makes it appear like it is not unwrapping, unless you’re printing stack traces: https://play.golang.org/p/x0JN-W_FStu
This ends up being misleading because one would naturally expect err2 := errors.Unwrap(errors.Wrap(err1))
would result in err2 == err1
but it does not, because internally errors.Wrap
is actually double wrapping. No one noticed when using Cause(…)
because it kept unwrapping until it got to a non-Causer, but errors.Unwrap
only unwraps a single layer. 😕
from errors.
errors.Cause
will repeatedly unwrap all of the pkg/errors
wrappings. So we get:
err := stdErrors.New("thing")
err2 := errors.WithMessage(err, "inner wrap")
err3 := errors.Wrap(err, "outer wrap")
cause := errors.Cause(err3)
unwrap := errors.Unwrap(err3)
// (cause == err) == true
// (unwrap != err3 && unwrap != err2 && unwrap != err) == true
There is no way in this scenario to retrieve err2
from err3
, and that’s not ideal.
from errors.
errors.Unwraps only unwraps errors wrapper with errors.Wrap, not fmt.Errorf
from errors.
Not sure to understand you here.
Do you mean that errors.Unwraps only unwraps errors wrapped with fmt.Errorf instead?
from errors.
Unwrap is just a wrapper around the stdlib errors package's Unwrap.
https://github.com/pkg/errors/blob/master/go113.go
from errors.
As @davecheney said the behaviour of the Unwrap
in the pkg/errors
is the same that the standard library:
https://play.golang.org/p/73xe4gnoXKz
from errors.
should use errors.Cause(err)
https://play.golang.org/p/L-uJU07lCAu
from errors.
Related Issues (20)
- Proposal: add errors.Is and errors.As
- RFC: Allow custom StackTraces
- func Is() does not works with errors.Wrap or errors.Wrapf HOT 3
- Cause() behavior has changed HOT 11
- respect -trimpath build flag HOT 3
- Questions about extending annotations HOT 5
- undefined errors.Wrap HOT 2
- How to change format return wrapped error message HOT 2
- Stacktrace don't print all stack HOT 6
- errors.Wrap() created bugs in our codebase. HOT 3
- StackTrace.Format with "%+v" includes a leading newline HOT 1
- A new error caused by another error HOT 7
- Demo
- Change Wrap() to return an error even if we provide nil HOT 3
- return *stack instead of stack HOT 2
- Wrap() duplicates call stack HOT 6
- Elegant way to check error is wrapped HOT 4
- `Errorf` should be able to wrap errors HOT 4
- Package errors looking for new maintainers HOT 4
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from errors.