cockroachdb / cockroachdb/errors
Behavior of HasType and HasInterface is counter-intuitive
- Dominant language
- Go
- Stars
- 2.5k
- Forks
- 74
- PR merge metrics
- No merged PRs in 30d
Description
Both of these functions call [`If`](https://sourcegraph.com/github.com/cockroachdb/errors@698c58cf81c4112204c35173983e95f2c7725de2/-/blob/markers/markers.go?L132-145) which does a traversal of the causal chain, it does not traverse the full tree. Specifically, `If` internally calls `UnwrapOnce` and doesn't handle the multi-error case, whereas functions like `Is` and `As` separately handle the multi-error case.
This leads to counter-intuitive behavior; you can have a value `x` of type `T`, and `errors.Is(err, x)` may be true, but `errors.HasType(err, T{})` may fail.
I noticed this behavior while trying to add property-based tests to better understand the behavior of `HasType` here. https://github.com/sourcegraph/sourcegraph/pull/62992
It would be valuable to either:
- Change the implementation of `If` to traverse the full tree
- OR Add a separate function which does a tree traversal (not just the "causal chain") and use that from `HasType` and `HasInterface`
- OR Add a cautionary warning to `HasType` and `HasInterface`'s docs which describe the behavior in the presence of multi-errors.
Contributor guide
No contributing guide indexed for this repository
Assessment
This issue has not been assessed yet.