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

Я использую следующее для проверки тайм-аутов при вызове веб-службы, но я бы хотел проверить, действительно ли есть ошибка тайм-аута. Как это сделать: 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) .

  • Как создать случайную строку фиксированной длины в Go?
  • Горутин не выполняется, если включено время.
  • Указатели против значений в параметрах и возвращаемых значениях
  • Вызовите функции Go из C
  • Что означают три точки «./...» в вызовах командной строки Go?
  • Как сбросить gotoutine stacktraces?
  • Почему нет дженериков в Go?
  • Спецификации: Какова цель пустого идентификатора в присвоении переменной?
  • Как разбить длинную строку кода в Голанге?
  • go работает отлично, но не работает
  • Обработка запроса JSON в Google
  • Interesting Posts

    Добавление уравнения регрессионной линии и R2 на графике

    Java – объявление из типа интерфейса вместо classа

    Что такое «корневая ссылка»?

    Попытка добавить adb к переменной PATH OSX

    График рассеяния Excel с ярлыками

    Как я могу вставить значение свойства в Spring Bean, который был настроен с помощью аннотаций?

    Почему возникла связанная с сетью или конкретная ошибка экземпляра при установлении соединения с SQL Server?

    async в консольном приложении на C #?

    Кто удаляет память, выделенную во время «новой» операции, которая имеет исключение в конструкторе?

    Если я опечатаю свое имя пользователя при ssh-ing, есть ли способ вернуться и изменить его?

    Как заставить Emacs читать буфер от stdin при запуске?

    Отправить текст для конкретного контакта программно (whatsapp)

    Как определить платформу / компилятор из макросов препроцессора?

    Windows 10 на asus x44h не работает

    Mac OS X в VirtualBox

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