英文:
Filter out broken pipe errors
问题
我从一个io.Copy
调用中得到一个error
,我将一个套接字(TCPConn
)作为目标传递给它。预期远程主机在不再需要时会简单地断开连接,而我没有收到任何来自它们的内容。
当断开连接发生时,我会得到以下错误:
write tcp 192.168.26.5:21277: broken pipe
但是我只有一个error
接口。如何区分断开管道错误和其他类型的错误?
if err.Errno == EPIPE...
英文:
I'm getting an error
returned from an io.Copy
call, to which I've passed a socket (TCPConn
) as the destination. It's expected that the remote host will simply drop the connection when they've had enough, and I'm not receiving anything from them.
When the drop occurs, I get this error:
write tcp 192.168.26.5:21277: broken pipe
But all I have is an error
interface. How can I differentiate broken pipe errors from other kinds of error?
if err.Errno == EPIPE...
答案1
得分: 19
The broken pipe error is defined in the syscall package. You can use the equality operator to compare the error to the one in syscall. Check http://golang.org/pkg/syscall/#constants for a complete list of syscall errors. Search "EPIPE" on the page and you will find all the defined errors grouped together.
if err == syscall.EPIPE {
/* ignore */
}
If you wish to get the actual errno number (although it is pretty useless) you can use a type assertion:
if e, ok := err.(syscall.Errno); ok {
errno = uintptr(e)
}
英文:
The broken pipe error is defined in the syscall package. You can use the equality operator to compare the error to the one in syscall. Check http://golang.org/pkg/syscall/#constants for a complete list of syscall errors. Search "EPIPE" on the page and you will find all the defined errors grouped together.
if err == syscall.EPIPE {
/* ignore */
}
If you wish to get the actual errno number (although it is pretty useless) you can use a type assertion:
if e, ok := err.(syscall.Errno); ok {
errno = uintptr(e)
}
答案2
得分: 10
从go 1.13开始,您可以使用errors.Is而不是类型断言。
if errors.Is(err, syscall.EPIPE) {
// 管道已断开
}
英文:
As of go 1.13, you can use errors.Is instead of type assertions.
if errors.Is(err, syscall.EPIPE) {
// broken pipe
}
答案3
得分: -1
拥有除了error
接口之外的所有接口已足够进行类型断言或类型切换,以揭示接口所持有的具体类型。
英文:
Having all but an error
interface is enough to perform a type assertion or a type switch to reveal the concrete type held by the interface.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论