-
Notifications
You must be signed in to change notification settings - Fork 17.8k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
errors: ensure the 1.13 method to access the cause is called Cause() not Unwrap() #31778
Comments
It is not a goal of the proposal to be compatible with existing error packages. Indeed, that is impossible, since they contradict each other. The goal is to establish a common set of names and behaviors, and the hope is that existing packages like
Couldn't you continue to use
|
why/how?
No that will fail if an error is wrapped both by |
There exist error implementations where the |
Can you provide examples. This is not my understanding. If you look at the doc of the related packages you will see the following used consistently:
What is the evidence you've found that some libraries do it differently? Are you going to report this evidence in the proposal? |
One package where the Cause method returns the root of the chain is |
I went and looked at the package you linked, and I am afraid the source code contradicts your statements:
So at this point I still see no evidence of library code in the ecosystem where the I would kindly request that you either provide some evidence or instead reconsider the Go 2/1.13 proposal for the method as requested at the top of this thread. |
You are mistaken: |
It looks to me like the errgo Cause function goes one level:
while the pkg/errors one follows the chain:
|
You could instead write your own function, looking for both |
Thank you for the example, although I believe it is disingenuous: this exemplifies specifically the feature of that package that hides the cause. The goal of that So far it does not seem you have provided evidence that in the common case (even a common case for
Yes I am aware I could do this. However, if I and other people find ourselves required to do this often (as I am arguing since the beginning of the thread), this would be strong evidence that the proposed definition of Go's error API is defective. Now (before 1.13 is released) would be an adequate time to study this risk and perhaps make adjustments before the Go user community finds themselves inconvenienced by the defect. |
As a matter of practicality, If we choose If we choose And ditto for any other API that is out there. I understand that the error values proposal isn't final yet, but I think it would be impractical to change it drastically without a strong reason since people are using it already (including me). Similarly, there was no guarantee that The point of this part of the error values proposal, as I see it, was to commit to a standard API across the Go ecosystem. That it is not the Addressing @knz's concern directly,
The error values proposal doesn't change the fact that every package needs to document an explicit contract about how a user will go about unwrapping or checking errors, or the backward compatibility implications thereof. All it does is adds a standard contract that hopefully all packages can agree upon going forward. |
I am really glad that you recognize that some people are going to be inconvenienced. It would be interesting here, for the sake of clarity and methodology, to estimate the size of the user populations. AFAIK There is a utility argument to be made about the amount of inconvenience. A solution that causes less inconvenience in aggregate seems (to me) to be the better solution. I am sure that the fact that you happen to be invested in the initial development of |
I would expect third party packages like github.com/pkg/errors to change their |
You realize that you could change the go 1.14/xerror code to use Cause instead and take the cost of the change for yourself, instead of pushing it to the community right?
So far the discussion has been pretty clear:
1) there's no real good reason to keep Unwrap over Cause other than choosing who to inconvenience the most
2) in terms of number of people inconvenienced you are choosing the maximum amount of inconvenience because... I guess it makes someone's life easier, consequences be dammed?
--
Sent from my Android device with K-9 Mail. Please excuse my brevity.
|
@knz please be respectful. |
Was this issue a reason for revert at 3e2c522? Edit after @jba's answer below. |
No. |
Our final decision is to stay with |
The rationale in https://go.googlesource.com/proposal/+/master/design/go2draft-error-values-overview.md mentions this:
In summary the rationale was "some people were confused so we're going to change the name".
However this choice creates a more serious technical problem.
Suppose a program upgrades to use Go 1.13 but has some dependency library that relies on
github.com/pkg/errors
(or anotherCause()
-compatible error library). Now consider what happens if our program makes some API call through its dependency, and that encounters an error from the standard library -- for exampleio.EOF
orcontext.DeadlineExceeded
. And then the intermediate library dependency wraps the error using the facilities ingithub.com/pkg/errors
which only providesCause()
.How is the program now meant to identify the ultimate cause of its error?
The proposal with
Is()
andUnwrap()
will be unable to "peek through" the wrappers created by the existing library code. This is defective design.Solution: By changing the design in Go 1.13 to instead make the causer access method remain
Cause()
, the new 1.13 error package would become/remain drop-in compatible with existing library error wrapper code.The text was updated successfully, but these errors were encountered: