2012-06-12 38 views
9

我收到一个io.Copy调用返回的error,我已经通过一个套接字(TCPConn)作为目的地。预计当远程主机有足够的时间时,它将简单地断开连接,但我没有收到任何东西。滤除破损的错误

当发生跌落,我得到这个错误:

write tcp 192.168.26.5:21277: broken pipe 

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

if err.Errno == EPIPE... 

回答

12

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

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

如果你希望得到实际的错误号数(虽然它是相当无用),你可以使用一个类型断言:

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

这看起来像赢家,我会放弃。 –

+0

是否将它与syscall.EPIPE工作相比较? –

+5

是的。另外,我必须首先键入assert到'net.OpError',然后比较'opErr.Err == syscall.EPIPE'。 –

-1

拥有所有,但一个error接口足以执行类型的断言或类型开关是为了揭示接口举行的具体类型。

+2

这不告诉我具体类型此错误是保持。 –