5.4 错误
Go 将错误视为预期结果之一,通过返回值而非异常机制处理。
错误类型
error 是内置接口。nil 表示成功,非 nil 表示失败。失败原因唯一时可用 bool,原因多样时用 error。
五种错误处理策略
1. 传播错误(最常用)
doc, err := html.Parse(resp.Body)
if err != nil {
return nil, fmt.Errorf("parsing %s as HTML: %v", url, err)
}
2. 重试(偶发性错误,限制次数/超时)
for tries := 0; time.Now().Before(deadline); tries++ {
_, err := http.Head(url)
if err == nil { return nil }
time.Sleep(time.Second << uint(tries))
}
3. 终止程序(仅在 main 中)
log.Fatalf("Site is down: %v\n", err)
4. 仅记录日志
log.Printf("ping failed: %v; networking disabled", err)
5. 忽略错误(需注释说明)
os.RemoveAll(dir) // 忽略错误,系统会定期清理
编码风格
先处理错误,再写正常逻辑:
f, err := os.Open(name)
if err != nil {
return err
}
// 正常逻辑
EOF
io.EOF 表示读到文件末尾,可直接比较:
if err == io.EOF {
break
}