我们有一个应用程序托管在一个docker容器中,调用REST API,我们希望识别网络超时并以特定的方式处理它们。现在,为了检测超时,我们使用以下代码片段: if netErr, ok := err.(net.Error); ok && netErr.Timeout() {
// do something...
}虽然这在捕获某些案例方面确实有效,但当我设置防火墙/安全组未正确配置且主机不可访问的集成测试时,它会导致以下错误:Post \"https://notreal.com/endpoint\": dial tcp 10.130.140.150:8443: i/o timeout编辑:看起来这是我们自己的库的问题。该错误最初是实现net的错误。错误,但被吞噬,仅返回字符串,不再实现 Timeout() 或 Temporary()。
1 回答
白猪掌柜的
TA贡献1893条经验 获得超10个赞
您必须自己实现它,就像您在这个SO答案中看到的那样。但是,另一种方法是使用外部包,该包将为您执行此操作,例如retryablehttp。
resp, err := retryablehttp.Get("/foo")
if err != nil {
panic(err)
}
返回的响应对象是一个 *http。响应,与你通常从net/http得到的东西一样。如果请求失败一次或多次,上述调用将阻止并重试指数退避。
如果您需要区分暂时性错误和永久错误(例如不存在的端点),您可以尝试这样的事情(不是由我自己测试的)?
if netErr, ok := err.(net.Error); ok && netErr.Temporary() {
// retry
}
if err != nil {
// unrecoverable error
log.Fatal(err)
}
捕获特定的网络错误可能是乏味的,因为有一堆错误,依此类推。AddrErrorDNSError
- 1 回答
- 0 关注
- 240 浏览
添加回答
举报
0/150
提交
取消