从 docker 开始处理 'dial tcp i/o timeout' 的错误
go error handling of 'dial tcp i/o timeout' from docker
我们在 docker 容器中托管了一个调用 REST API 的应用程序,我们想要识别网络超时并以特定方式处理它们
现在我们使用以下代码片段来检测超时:
if netErr, ok := err.(net.Error); ok && netErr.Timeout() {
// do something...
}
虽然这在捕获某些情况下确实有效,但当我设置集成测试时 firewall/security 组配置不正确且主机不可访问,导致以下错误:
Post \"https://notreal.com/endpoint\": dial tcp 10.130.140.150:8443: i/o timeout
在这种情况下,它似乎不属于 net.Error,关于如何识别它的想法?
编辑:
看起来这是我们自己的库的问题。该错误最初是一个实现 net.Error 但被吞没的错误,仅返回字符串并且不再实现 Timeout() 或 Temporary().
你必须自己实现它,就像你在这个. However another way to this is to use an external package that will do that for you like retryablehttp
中看到的那样。
resp, err := retryablehttp.Get("/foo")
if err != nil {
panic(err)
}
The returned response object is an *http.Response, the same thing you would usually get from net/http. Had the request failed one or more times, the above call would block and retry with exponential backoff.
如果你需要区分暂时性错误和永久性错误(比如不存在的端点),你可以尝试这样的事情(不是我自己测试的)?
if netErr, ok := err.(net.Error); ok && netErr.Temporary() {
// retry
}
if err != nil {
// unrecoverable error
log.Fatal(err)
}
捕获特定的网络错误可能很乏味,因为有一堆错误 AddrError
、DNSError
和 so on.
我们在 docker 容器中托管了一个调用 REST API 的应用程序,我们想要识别网络超时并以特定方式处理它们
现在我们使用以下代码片段来检测超时:
if netErr, ok := err.(net.Error); ok && netErr.Timeout() {
// do something...
}
虽然这在捕获某些情况下确实有效,但当我设置集成测试时 firewall/security 组配置不正确且主机不可访问,导致以下错误:
Post \"https://notreal.com/endpoint\": dial tcp 10.130.140.150:8443: i/o timeout
在这种情况下,它似乎不属于 net.Error,关于如何识别它的想法?
编辑:
看起来这是我们自己的库的问题。该错误最初是一个实现 net.Error 但被吞没的错误,仅返回字符串并且不再实现 Timeout() 或 Temporary().
你必须自己实现它,就像你在这个retryablehttp
中看到的那样。
resp, err := retryablehttp.Get("/foo")
if err != nil {
panic(err)
}
The returned response object is an *http.Response, the same thing you would usually get from net/http. Had the request failed one or more times, the above call would block and retry with exponential backoff.
如果你需要区分暂时性错误和永久性错误(比如不存在的端点),你可以尝试这样的事情(不是我自己测试的)?
if netErr, ok := err.(net.Error); ok && netErr.Temporary() {
// retry
}
if err != nil {
// unrecoverable error
log.Fatal(err)
}
捕获特定的网络错误可能很乏味,因为有一堆错误 AddrError
、DNSError
和 so on.