猿问

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

我们有一个应用程序托管在一个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()。


DIEA
浏览 241回答 1
1回答

白猪掌柜的

您必须自己实现它,就像您在这个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
随时随地看视频慕课网APP

相关分类

Go
我要回答