过滤掉损坏的管道错误

时间:2012-06-12 19:42:23

标签: io go system-calls broken-pipe epipe

我从error调用返回io.Copy,我已通过套接字(TCPConn)作为目标。预计远程主机只有在足够的时候才会断开连接,而我却没有收到任何连接。

发生丢弃时,我收到此错误:

write tcp 192.168.26.5:21277: broken pipe

但我所拥有的只是一个error界面。如何区分破损的管道错误与其他类型的错误?

if err.Errno == EPIPE...

3 个答案:

答案 0 :(得分:13)

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

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

如果你想获得实际的errno数字(尽管它没用),你可以使用类型断言:

if e, ok := err.(syscall.Errno); ok {
    errno = uintptr(e)
}

答案 1 :(得分:2)

从版本1.13开始,您可以使用errors.Is代替类型断言。

if errors.Is(err, syscall.EPIPE) {
  // broken pipe
}

答案 2 :(得分:-1)

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