cockroachdb / cockroachdb/errors

Behavior of HasType and HasInterface is counter-intuitive

Abierto
#145 1 comentario 1 reacción 0 asignados Ver en GitHub
Lenguaje dominante
Go
Estrellas
2.5k
Forks
74
Métricas de merge de PR
Sin PR fusionados en 30 d

Descripción

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.

Guía de contribución

No hay ninguna guía de contribución indexada para este repositorio

Evaluación

Este issue todavía no se ha evaluado.

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.