登录
首页 >  Golang >  Go问答

专门检查超时错误

来源:Golang技术栈

时间:2023-04-30 16:26:34 404浏览 收藏

知识点掌握了,还需要不断练习才能熟练运用。下面golang学习网给大家带来一个Golang开发实战,手把手教大家学习《专门检查超时错误》,在实现功能的过程中也带大家重新温习相关知识点,温故而知新,回头看看说不定又有不一样的感悟!

问题内容

我在调用 web 服务时使用以下内容检查超时,但我想具体检查是否返回超时错误。我该怎么做: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正确Timeout()设置。您需要检查的是:

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

在旧版本中,通过 http 包检查超时更加困难。

  • *net.OpError如果您在底层连接上设置了截止日期,您可以获得with Timeout() 。
  • 你可以得到一个实现接口的tlsHandshakeTimeoutError(显然没有导出) 。net.Error
  • url.Error如果 url 包内有问题(初始连接期间超时),您可以获得
  • 如果您使用http.Client.Timeout[go1.3+] 设置的超时(调用Transport.CancelRequest),您可能会收到“使用关闭的网络连接”的错误。从 go1.5 开始,这将正确设置 Timeout 属性。

net.Error您可以使用类型开关检查 a :

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 http.Client超时:

if err != nil && strings.Contains(err.Error(), "use of closed network connection") {
    fmt.Println("Could be from a Transport.CancelRequest")
}

理论要掌握,实操不能落!以上关于《专门检查超时错误》的详细介绍,大家都掌握了吧!如果想要继续提升自己的能力,那么就来关注golang学习网公众号吧!

声明:本文转载于:Golang技术栈 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>