【问题标题】:Filter out broken pipe errors过滤掉断管错误
【发布时间】:2012-06-15 18:00:37
【问题描述】:

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

发生掉落时,我收到此错误:

write tcp 192.168.26.5:21277: broken pipe

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

if err.Errno == EPIPE...

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 这并没有告诉我这个错误的具体类型在哪里。
    【解决方案2】:

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

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

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

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

    【讨论】:

    • 这看起来像个赢家,我试试看。
    • 是的。此外,我必须先输入net.OpError,然后比较opErr.Err == syscall.EPIPE
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2015-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-25
      • 1970-01-01
      • 1970-01-01
      • 2011-03-29
      相关资源
      最近更新 更多