Начиная с 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")
}
Вы хотите интерфейс net.Error
. http://golang.org/pkg/net/#Error
if e,ok := err.(net.Error); ok && e.Timeout() {
// This was a timeout
} else if err != nil {
// This was an error, but not a timeout
}
Обратите внимание, что утверждение типа err.(net.Error)
корректно обрабатывает случай nil
и возвращает false для значения ok
, если nil
возвращается как ошибка, короткое замыкание проверки Timeout
.
response, err := client.Do(req) if e, ok := err.(net.Error); ok && e.Timeout() { // This was a timeout fmt.Println("timeout") return }
ничего мне не дает: S
– Martijn van Maasakkers
6 May 2014 в 14:20
else if err != nil
, чтобы покрыть ошибки, не связанные с таймаутом.
– LinearZoetrope
6 May 2014 в 14:26
DialTimeout
должен возвращать net.Error
, если он терпит неудачу. Я пытаюсь прочитать источник пакета net
, но, к сожалению, низкоуровневый сетевой код является системным, и, следовательно, немного сложно найти доказательства того, что возвращается, поскольку он похоронен под 30 вызовами функций в разных файлах.
– LinearZoetrope
6 May 2014 в 14:53
net.Error
, так как вы могли бы вернуть Timeouts, которые не являются OpError. – JimB 6 May 2014 в 17:17