过滤掉破损的管道错误

问题描述 投票:9回答:3

我正在从error调用返回一个io.Copy,我已将套接字(TCPConn)传递到了该目标。期望远程主机在它们受够了之后会简单地断开连接,而我不会从他们那里收到任何信息。

发生下降时,出现此错误:

write tcp 192.168.26.5:21277: broken pipe

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

if err.Errno == EPIPE...
io go system-calls broken-pipe epipe
3个回答
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)
}

0
投票

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

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

-1
投票

error接口以外的所有接口就足以执行类型声明或类型切换以显示该接口保留的具体类型。

© www.soinside.com 2019 - 2024. All rights reserved.