我在调用webservice时使用以下内容检查超时,但我想特别检查是否返回了超时错误.我该怎么做: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),
},
}
}
Run Code Online (Sandbox Code Playgroud)
Jim*_*imB 62
从go1.6开始,所有来自超时的错误都应该net.Error
与Timeout()
正确设置一致.您需要检查的是:
if err, ok := err.(net.Error); ok && err.Timeout() {
Run Code Online (Sandbox Code Playgroud)
在旧版本中,通过http包检查超时更加困难.
*net.OpError
如果您在底层连接上设置截止日期,则可以使用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")
}
}
Run Code Online (Sandbox Code Playgroud)
使用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")
}
Run Code Online (Sandbox Code Playgroud)
Jim*_*mbo 17
您可以简单地将错误传递给os.IsTimeout(),如果它是 net/http 返回的超时,那么它将返回 true。
func IsTimeout(err error) bool
IsTimeout 返回一个布尔值,指示是否已知错误以报告超时发生。
Lin*_*ope 14
你想要的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
}
Run Code Online (Sandbox Code Playgroud)
请注意,类型断言err.(net.Error)
将正确处理nil
大小写,ok
如果nil
作为错误返回,则返回false,从而使Timeout
检查短路.
归档时间: |
|
查看次数: |
20091 次 |
最近记录: |