如何处理 Go 中的 HTTP 超时错误(附代码)

682 阅读1分钟

要在Go中处理HTTP超时错误,可以使用 os.IsTimeout()函数,该函数来自内置的 os包中的函数。如果超过了请求时间限制,它将返回true ,否则返回false

例子

在这个例子中,我们创建了一个HTTP客户端,超时时间为1纳秒。有了这么短的超时,我们就可以确定,当我们向https://example.com 服务器发送请求时,我们会收到一个超时错误:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
package main

import (
 "log"
 "net/http"
 "os"
 "time"
)

func main() {
 httpClient := http.Client{Timeout: 1 * time.Nanosecond}

 req, err := http.NewRequest(http.MethodGet, "https://example.com", nil)
 if err != nil {
 log.Fatal(err)
 }

 _, err = httpClient.Do(req)
 if os.IsTimeout(err) {
 log.Printf("timeout error: %v\n", err)
 }
}

输出:

2022/08/28 18:35:48 timeout error: Get "https://example.com": context deadline exceeded (Client.Timeout exceeded while awaiting headers)

为了确保 os.IsTimeout()正常工作,将11 行中的超时值改为1 * time.Minute 。如果目前https://example.com 没有问题,请求将在1分钟的时间限制内被处理,你将不会在输出中看到任何错误。