为了账号安全,请及时绑定邮箱和手机立即绑定

从 docker 转到“拨号 tcp i/o 超时”的错误处理

从 docker 转到“拨号 tcp i/o 超时”的错误处理

Go
DIEA 2022-08-24 10:44:51
我们有一个应用程序托管在一个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


查看完整回答
反对 回复 2022-08-24
  • 1 回答
  • 0 关注
  • 240 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信