The Day the Linter Broke My Code
8 months ago
- #Linters
- #Error Handling
- #Go
- 在Go中设计自定义错误需要正确实现`Error`、`Is`和`Unwrap`方法。
- `DataEOFError`类型包含文件名,并通过`Is`方法使其与`io.ErrUnexpectedEOF`被视为相等。
- `ProcessingFailedError`类型包含处理ID并包装了`Reason`错误,其实例之间不相等。
- 错误比较推荐使用`errors.Is()`,但在`Is`方法内部必须使用直接比较(`==`)。
- 一个linter(`err113`)错误地建议在`Is`方法中用`errors.Is()`替换直接比较,这会破坏错误处理语义。
- `errors.Is()`函数不具备对称性,不应在`Is`方法中使用,以避免错误的等价判断。
- 真实案例(`fluxcd Controller Runtime`)展示了错误的`Is`实现如何导致意外的错误匹配。
- 关键原则:用直接比较实现`Is`方法,谨慎对待linter建议,并充分测试错误类型。