Hello everyone. In relation to standard errors package, I wanted to ask 
about safe ways of implementing Is(target error) bool. The current 
documentation 
(https://cs.opensource.google/go/go/+/refs/tags/go1.20.6:src/errors/wrap.go;l=35)
 
says the following:

// An error type might provide an Is method so it can be treated as 
equivalent 
// to an existing error. For example, if MyError defines 
// 
// func (m MyError) Is(target error) bool { return target == fs.ErrExist }

This seems wrong and actually leads users in the wrong direction, as if 
someone implements an error type like "type MyErrs []error" then it's 
sufficient to make that implementation panic, so the documentation is 
leading users to create panic-prone code. While it's true that interfaces 
are comparable, concrete types implementing them may not, and the error 
will happen at runtime.

Note that the code for the Is function in errors package actually uses 
reflectlite.TypeOf(target).Comparable() 
to avoid these panics, but that as users do not have access to reflectlite 
and, even if they do, the documentation is not warning against these 
possible panics, then it's very easy to make mistakes. Of course, nil 
comparisons are ok, because the comparison is of the value of the 
interface, not the value of the concrete type.

I propose: consider changing the documentation to warn users against this 
possible problem when implementing the Is method of their own error types.

My question to the community: how do you currently go about this issue.

Thank you.

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/golang-nuts/1fce8a3e-bcd2-41fc-b2e1-02fd70450c09n%40googlegroups.com.

Reply via email to