使用实现的接口通常io.ReadWriteCloser
会返回一个错误。implements ,所以我希望它也会返回这个错误,但不幸的是它不遵循这个约定。相反,它在 net.go 中返回一个私有声明的 errClosing。io.EOF
io.ErrUnexpectedEOF
net.Listener
io.Closer
返回的错误net.Listener
包含在net.OpError
. 这个结构有一些可能有用的附加信息——特别是“Op”和“Err”。“Op”告诉您错误发生的位置。当你执行时,Close() error
你会得到“接受”。文档说你也可以得到“读”和“写”回来。
要获得net.OpError
,您可以这样做:
err := server.Serve(l)
if opErr, ok := err.(*net.OpError); ok {
// opErr.Op, opErr.Err, ...
}
或者像这样(假设net.Listener
总是返回 a net.OpError
):
err := server.Serve(l).(*net.OpError)
net.OptError.Err 返回原始错误,如果错误被导出,这将很有帮助。无论哪种方式,我都不建议检查字符串,因为这可能会在未来的版本中中断。最好将错误直接与您没有的导出错误进行比较。
net.OptError
还Temporary() bool
声明了一个函数。该net/http
包使用它来重新建立连接以增加间隔。因此,在这种情况下,net/http
我会假设返回的任何错误都是调用Close() error
. 否则Temporary() bool
将返回 true,这会net/http
为您捕获。