2012-06-12 13 views
9

Ricevo un error restituito da una chiamata io.Copy, a cui ho passato un socket (TCPConn) come destinazione. Si prevede che l'host remoto lascerà semplicemente la connessione quando ne avrà abbastanza, e non riceverò nulla da loro.Filtrare gli errori di tubo rotto

Quando si verifica la caduta, ottengo questo errore:

write tcp 192.168.26.5:21277: broken pipe 

Ma tutto quello che ho è un'interfaccia error. Come posso differenziare gli errori di pipe broken da altri tipi di errore?

if err.Errno == EPIPE... 

risposta

12

L'errore di tubo rotto è definito nel pacchetto syscall. È possibile utilizzare l'operatore di uguaglianza per confrontare l'errore con quello in syscall. Controlla http://golang.org/pkg/syscall/#constants per un elenco completo degli errori syscall. Cerca "EPIPE" nella pagina e troverai tutti gli errori definiti raggruppati insieme.

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

Se si desidera ottenere il numero errno reale (anche se è abbastanza inutile) è possibile utilizzare un tipo di asserzione:

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

Questo sembra un vincitore, darò un via. –

+0

Il confronto con syscall.EPIPE funziona? –

+5

Sì, sì. Inoltre ho dovuto digitare type-assert su 'net.OpError', quindi confrontare' opErr.Err == syscall.EPIPE'. –

-1

Avere tutti, ma un'interfaccia error è sufficiente per eseguire un tipo di affermazione o di un interruttore di tipo a rivelare il tipo concreto tenuto dall'interfaccia.

+2

Questo non mi dice dove il tipo concreto di questo errore è tenuto. –