13

error从一个调用中得到一个返回io.Copy,我已经将一个套接字 ( TCPConn) 作为目标传递给它。预计远程主机会在他们受够了之后简单地断开连接,而我没有收到他们的任何信息。

发生下降时,我收到此错误:

write tcp 192.168.26.5:21277: broken pipe

但我只有一个error界面。如何区分断管错误和其他类型的错误?

if err.Errno == EPIPE...
4

3 回答 3

19

损坏的管道错误在 syscall 包中定义。您可以使用相等运算符将错误与系统调用中的错误进行比较。检查http://golang.org/pkg/syscall/#constants以获取系统调用错误的完整列表。在页面上搜索“EPIPE”,您会发现所有已定义的错误组合在一起。

if err == syscall.EPIPE {
    /* ignore */
}

如果您希望获得实际的 errno 编号(尽管它非常无用),您可以使用类型断言:

if e, ok := err.(syscall.Errno); ok {
    errno = uintptr(e)
}
于 2012-06-12T20:20:00.197 回答
10

从 go 1.13 开始,您可以使用errors.Is而不是类型断言。

if errors.Is(err, syscall.EPIPE) {
  // broken pipe
}
于 2019-10-03T22:19:31.740 回答
-1

除了error接口之外的所有内容就足以执行类型断言或类型切换以显示接口所持有的具体类型。

于 2012-06-12T19:56:27.537 回答