在Go中习惯性地过滤错误

Go中的错误类型非常广泛,包含的实际类型可能因平台和版本而异.是否习惯于过滤错误的字符串值error.Error()所期望的错误?

例如:

_, err := conn.Write(b)
if err != nil {
    if !strings.Contains(err.Error(), "peer reset") {
        log.Print(err)
    }
    return
}

有一个更好的方法吗?

最佳答案
我不确定我在说什么你不知道,但我已经看到了一些方法来处理它:比较它们被导出并出现在godoc中的已知实例,如io.EOF或os.ErrNotExist ;当docs承诺某种类型的错误时使用类型断言或开关,如* os.PathError或* os.LinkError;或者放弃并查看消息.第一个应该足够清楚,你已经完成了问题的第三个;检查类型可能如下所示:

if pathErr, ok := err.(*os.PathError); ok {
    log.Fatal("Bad path " + pathErr.Path + ", giving up")
} else if err != nil {
    return err
}

我认为这种情况很少见,但如果您涉及多种潜在类型,您可以想象使用type switch

switch err.(type) {
case *os.PathError, *os.LinkError:
    log.Fatal("oof")
case nil:
    // nothing; prevents default
default:
    log.Fatal("huh")
}

(这里选择错误和行为有点傻 – 我只是试图用语法建立一个模板.)

您在问题中提到的难点:可能不清楚是什么保证您将返回哪些错误.我知道,例如,1.5 release notes说他们在net.OpError标准化的净误差比以前更多,但这就是我所知道的.如果您认为有重要案例不清楚,那么您正在打电话或打电话询问人员问题.

转载注明原文:在Go中习惯性地过滤错误 - 代码日志