2 回答

TA贡献1799条经验 获得超8个赞
conn.Read
一般来说,可重试的操作不会出现任何错误。该界面的大多数使用io.Reader
都会假设所有错误都是最终的。
任何net
确保可重试的包错误都将符合接口net.Error
,并公开一个Temporary
方法。
这最常在Accept
循环中使用,就像 http 包中的这个解释示例一样
for {
rw, e := l.Accept()
if e != nil {
if ne, ok := e.(net.Error); ok && ne.Temporary() {
if tempDelay == 0 {
tempDelay = 5 * time.Millisecond
} else {
tempDelay *= 2
}
if max := 1 * time.Second; tempDelay > max {
tempDelay = max
}
time.Sleep(tempDelay)
continue
}
return e
}
}
任何其他可能的情况都需要在了解协议和当前情况的情况下根据个人情况进行处理。

TA贡献1865条经验 获得超7个赞
超时是从net.TCPConn读取时唯一可恢复的错误,并且只有在连接上设置读取截止时间时才会返回该错误。
使用 Error.Temporary()检查重试时可能解决的错误,并使用Error.Timeout()检查超时:
n, err := c.Read(buf)
// process buf[:n] bytes
if e.(net.Error); ok && e.Timeout() && e.Temporary() {
// handle recoverable read deadline expiration
} else if err != nil {
// handle other errors
}

TA贡献1853条经验 获得超18个赞
查看net包的具体错误类型https://golang.org/pkg/net/#OpError
它提供了一种特定的Temporary()
方法来确定是否是非终止错误。
要手动找出哪个错误,Temporary
您必须检查网络、操作系统和其他一些内部包中定义的每个错误。
要以编程方式检查临时错误,您可以声明自己的 local ,或者可以依赖 net 包https://golang.org/pkg/net/#Errortemporary interface{ Temporary() bool }
提供的此接口
该OpError.Temporary
方法测试其内部错误是否实现了net.temporary
接口(https://golang.org/src/net/net.go?s=16056:16090#L501Temporary()
),如果是则返回内部错误的调用结果,例如https://golang.org/src/net/net.go?s=19122:19157#L605。
我不确定您正在考虑哪种读取重试,但是,内部 fd.read 方法再次实现重试 https://golang.org/src/internal/poll/fd_unix.go#L165
- 2 回答
- 0 关注
- 122 浏览
添加回答
举报