cockroachdb / cockroachdb/errors

Behavior of HasType and HasInterface is counter-intuitive

未關閉
#145 1 則留言 1 個 reaction 已指派 0 人 在 GitHub 檢視
主要語言
Go
星號
2.5k
分支
74
PR 合併指標
30 天內沒有已合併 PR

描述

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.

貢獻指南

這個儲存庫沒有索引到貢獻指南

評估

這個 Issue 還沒有評估資料。

把新 issue 寄到你的電子郵件信箱

精選適合新手參與的 GitHub issue 摘要。