2012-06-12 16 views
9

Otrzymuję error zwrócony z połączenia io.Copy, do którego przekazałem gniazdo (TCPConn) jako miejsce docelowe. Oczekuje się, że zdalny host po prostu zrzuci połączenie, gdy będzie miał dość i nic nie otrzymam od nich.Odfiltrowywanie przerwanych przewodów błędów

Gdy nastąpi spadek, otrzymuję ten błąd:

write tcp 192.168.26.5:21277: broken pipe 

Ale mam to interfejs error. Jak odróżnić błędy przerwanych przewodów od innych rodzajów błędów?

if err.Errno == EPIPE... 

Odpowiedz

12

Błąd przerwanego przewodu jest zdefiniowany w pakiecie syscall. Możesz użyć operatora równości, aby porównać błąd z tym w syscall. Sprawdź http://golang.org/pkg/syscall/#constants, aby uzyskać pełną listę błędów systemowych. Wyszukaj "EPIPE" na stronie, a wszystkie zdefiniowane błędy zostaną zgrupowane razem.

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

Jeśli chcesz uzyskać rzeczywistą liczbę errno (choć jest całkiem bezużyteczny) można użyć twierdzenia typu:

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

Wygląda na to, że zwycięzca, dam ci szansę. –

+0

Czy porównanie go z pracą syscall.EPIPE? –

+5

Tak, tak. Oprócz tego musiałem najpierw wpisać -..., a następnie porównać 'opErr.Err == syscall.EPIPE'. –

-1

uwzględniając wszystkie, ale interfejs error wystarczy wykonać twierdzenie typu lub przełącznik typu, aby odsłonić konkretny rodzaj posiadanych przez interfejs.

+2

To nie powiedzieć mi, gdzie konkretny typ tego błędu jest trzymany. –