过滤掉损坏的管道错误

Mat*_*ner 10 io broken-pipe system-calls go epipe

我正在接到error一个io.Copy电话,我已经通过一个socket(TCPConn)作为目的地.预计远程主机只有在足够的时候才会断开连接,而我却没有收到任何连接.

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

write tcp 192.168.26.5:21277: broken pipe
Run Code Online (Sandbox Code Playgroud)

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

if err.Errno == EPIPE...
Run Code Online (Sandbox Code Playgroud)

Ste*_*erg 13

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

if err == syscall.EPIPE {
    /* ignore */
}
Run Code Online (Sandbox Code Playgroud)

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

if e, ok := err.(syscall.Errno); ok {
    errno = uintptr(e)
}
Run Code Online (Sandbox Code Playgroud)

  • 是的,它确实.另外我必须首先键入断言为`net.OpError`,然后比较'opErr.Err == syscall.EPIPE`. (5认同)

小智 10

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

if errors.Is(err, syscall.EPIPE) {
  // broken pipe
}
Run Code Online (Sandbox Code Playgroud)