Начиная с go1.6, все ошибки от тайм-аутов должны соответствовать net.Error
, если Timeout()
установлен правильно. Все, что вам нужно проверить, это:
if err, ok := err.(net.Error); ok && err.Timeout() {
В старых версиях проверка на таймаут через http-пакет была более сложной.
*net.OpError
с Timeout (), если вы нажмете Deadline, установленный в базовом соединении. tlsHandshakeTimeoutError
(который явно не экспортируется), который реализует интерфейс net.Error
. url.Error
, если в пакете url возникла проблема (таймаут во время начального соединения) http.Client.Timeout
[go1.3 +] (который вызывает Transport.CancelRequest
). Начиная с go1.5, это свойство будет правильно установлено свойство Timeout. Вы можете проверить net.Error
с помощью переключателя типа:
switch err := err.(type) {
case net.Error:
if err.Timeout() {
fmt.Println("This was a net.Error with a Timeout")
}
case *url.Error:
fmt.Println("This is a *url.Error")
if err, ok := err.Err.(net.Error); ok && err.Timeout() {
fmt.Println("and it was because of a timeout")
}
}
С go & lt; 1.5 вам нужно будет проверить строку ошибки для таймаута http.Client
:
if err != nil && strings.Contains(err.Error(), "use of closed network connection") {
fmt.Println("Could be from a Transport.CancelRequest")
}