cockroachdb / errors

Go error library with error portability over the network
Apache License 2.0
2.03k stars 65 forks source link

Behavior of HasType and HasInterface is counter-intuitive #145

Open varungandhi-src opened 1 month ago

varungandhi-src commented 1 month ago

Both of these functions call If 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:

varungandhi-src commented 1 month ago

It seems like this is basically the same kind of issue as https://github.com/cockroachdb/errors/issues/135, but for HasType and HasInterface.