Hasty Briefsbeta

双语

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建议,并充分测试错误类型。