在Go中习惯性地过滤错误

时间:2015-08-02 04:54:14

标签: go error-handling runtime-error

Go中的error类型相当广泛,包含的实际类型可能因平台和版本而异。根据错误的字符串值error.Error()过滤我们所期望的错误,这是不恰当的吗?

例如:

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

有更好的方法吗?

1 个答案:

答案 0 :(得分:1)

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

*os.LinkError

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

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

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

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