2012-06-12 49 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

這不告訴我具體類型此錯誤是保持。 –