我使用以下方法来检查调用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),
},
}
}
4条答案
按热度按时间n3schb8v1#
如果您专门查找i/o超时,则可以使用
errors.Is
来检测os.ErrDeadlineExceeded
错误,如net
包中所述:所有可能的超时仍将符合
net.Error
与Timeout()
正确设置。所有您需要检查的是:kjthegm62#
你可以简单地向os.IsTimeout()传递一个错误,如果它是由net/http返回的超时,那么它将返回true。
func IsTimeout(err error) bool
IsTimeout返回一个布尔值,指示是否已知错误报告发生了超时。
u0njafvf3#
您需要
net.Error
接口。http://golang.org/pkg/net/#Error请注意,类型Assert
err.(net.Error)
将正确处理nil
的情况,如果nil
作为错误返回,则ok
值将返回false,从而使Timeout
检查短路。qyyhg6bp4#
也可以这样做: