В частности, проверьте ошибку тайм-аута

Я использую следующее для проверки тайм-аутов при вызове веб-службы, но я бы хотел проверить, действительно ли есть ошибка тайм-аута. Как это сделать: S

У меня есть это:

// Timeout type Timeout struct { Connect time.Duration ReadWrite time.Duration } // TimeoutDialer func TimeoutDialer(timeout *Timeout) func(net, addr string) (c net.Conn, err error) { return func(netw, addr string) (net.Conn, error) { conn, err := net.DialTimeout(netw, addr, timeout.Connect) if err != nil { return nil, err } conn.SetDeadline(time.Now().Add(timeout.ReadWrite)) return conn, nil } } // HttpClient func HttpClient(config Config) *http.Client { to := &Timeout{ Connect: time.Duration(config.MaxWait) * time.Second, ReadWrite: time.Duration(config.MaxWait) * time.Second, } return &http.Client{ Transport: &http.Transport{ Dial: TimeoutDialer(to), }, } } 

Начиная с go1.6, все ошибки от тайм-аутов должны соответствовать требованиям net.Error with Timeout() . Все, что вам нужно проверить, это:

 if err, ok := err.(net.Error); ok && err.Timeout() { 

В более старых версиях проверка таймаута через пакет http была сложнее.

  • Вы можете получить *net.OpError с *net.OpError (), если вы нажмете крайний срок, установленный в базовом соединении.
  • Вы можете получить 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 <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 возвращается как ошибка, короткое замыкание err.(net.Error) .

  • Как разбить длинную строку кода в Голанге?
  • Почему fmt.Println внутри goroutine не печатает строку?
  • как слушать N каналов? (оператор динамического выбора)
  • json.Marshal (struct) возвращает "{}"
  • Спецификации: Какова цель пустого идентификатора в присвоении переменной?
  • Что означают три точки «./...» в вызовах командной строки Go?
  • Имеются ли стандартные переменные Err?
  • Почему в Go идут массивы?
  • какими должны быть значения GOPATH и GOROOT?
  • Unmarshal JSON с неизвестными полями
  • Ошибка «Неизвестная escape-последовательность» в Go
  • Interesting Posts

    Почему мой код Entity Framework Code First proxy null и почему я не могу его установить?

    Android Studio не может разрешить символ, но код выполняется правильно

    Почему XML используется для создания макетов пользовательского интерфейса в Android?

    Поверните изображение на 90, 180 или 270 gradleусов

    Анонимные кодовые блоки в Java

    Open Source Cocoa / Cocoa-Touch POP3 / SMTP библиотека?

    Случайное число, но не повторять

    Является ли широкий литерал буква символов, начинающийся с L, как L «Hello World», гарантированный для кодирования в Unicode?

    Используя операционную систему приманки, с другой ОС, скрытой TrueCrypt?

    Как использовать шрифт Awesome с webjars.org с JSF

    Преобразование гостевой системы VirtualBox в основную ОС

    Как запустить «ifconfig wlan0 down / up» с помощью комманда?

    Список свойств интерфейса Java Swing?

    Как подключиться к виртуальному настольному клиенту VirtualBox с помощью VNC?

    Почему URL-адреса в пространствах имен XML?

    Давайте будем гением компьютера.