go程序使用控制流机制应对错误,这种方式在错误处理逻辑方面要求更加小心谨慎。以下提供了三种方案以供参考。
直接返回错误
通常我们遇到err!=nil的情况时,可以在拼接必要信息后,直接返回该错误
if err != nil {
return nil, fmt.Errorf("error is %v", err)
}
这样通过层层拼接,就可以形成一个错误链路,方便用户查看报错信息。注意最好不要换行,方便用户通过grep等脚本查看完整的报错。
反复尝试至超时
通常在http请求失败时,在短暂的时间间隔后对请求进行重传是非常合理的,超过一定重复次数和限定时间后再报错退出。下面代码提供了一个对应的实现方案。
func waitUntil() {
const timeout = 10 * time.Second
var deadline = time.Now().Add(timeout)
var start = time.Now()
// 超时之前一直尝试
for tries := 0; time.Now().Before(deadline); tries++ {
log.Printf("this is the %vth try, %v\n", tries, time.Since(start))
// 指数级退避策略
time.Sleep(time.Millisecond << uint(tries))
}
}
停止系统运行
当我们调试时,遇到错误可能会需要直接停止系统,使用如下代码。
os.Exit(1)
// or
log.Fatalf("system down.")