如何确定请求是否超时?

时间:2018-07-11 18:40:51

标签: go error-handling timeout type-assertion

我现在已经学习了如何向http.Request添加带有超时的上下文。这是MWE:

package main

import (
    "context"
    "fmt"
    "log"
    "net/http"
    "time"
)

const (
    timeout = 700 * time.Millisecond
    url     = "https://twitter.com"
)

var client = http.DefaultClient

func main() {
    ctx, cancel := context.WithTimeout(context.Background(), timeout)
    defer cancel()

    req, _ := http.NewRequest("GET", url, nil) // must succeed
    req = req.WithContext(ctx)

    res, err := client.Do(req)

    if err != nil {
        log.Fatal(err)
    }
    fmt.Println(res.StatusCode)
}

如果网络/ Twitter足够慢,我会根据需要得到以下输出。

2018/07/11 19:29:55 Get https://twitter.com: context deadline exceeded

但是,如何以编程方式确定最后期限是否到期? Do上的*http.Client方法似乎返回了一个清晰的error “潜在的错误(context.DeadlineExceeded),但没有暴露出来……

我真的不想依靠解析该错误的消息来检查其原因是否为context.DeadlineExceeded。有没有其他办法?我想念什么吗?

理想情况下,我希望能够执行以下操作:

// ...
res, err := client.Do(req)

type causer interface {
    error
    Cause() error
}

if err, ok := err.(causer); ok && err.Cause() == context.DeadlineExceeded {
    // deal with the fact that the request timed out
}
// ...

0 个答案:

没有答案