2012-06-12 9 views
9

Recibo un error devuelto por una llamada io.Copy, a la que he pasado un socket (TCPConn) como destino. Se espera que el host remoto simplemente desconecte la conexión cuando ya hayan tenido suficiente, y no recibiré nada de ellos.Filtrar errores de tuberías rotas

Cuando se produce la caída, me sale este error:

write tcp 192.168.26.5:21277: broken pipe 

Pero todo lo que tengo es una interfaz error. ¿Cómo puedo diferenciar los errores de tuberías rotas de otros tipos de error?

if err.Errno == EPIPE... 

Respuesta

12

El error de tubería rota se define en el paquete syscall. Puede usar el operador de igualdad para comparar el error con el de syscall. Consulte http://golang.org/pkg/syscall/#constants para obtener una lista completa de los errores de syscall. Busque "EPIPE" en la página y encontrará todos los errores definidos agrupados.

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

Si desea obtener el número errno real (aunque es bastante inútil) se puede utilizar un tipo de afirmación:

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

Esto parece un ganador, voy a intentarlo. –

+0

¿Lo comparó con syscall.EPIPE? –

+5

Sí lo hizo. Además, tuve que escribir-assert a 'net.OpError' primero, luego comparar' opErr.Err == syscall.EPIPE'. –

-1

Tener todos menos una interfaz error es suficiente para realizar una afirmación de tipo o un detector de revelar el tipo de hormigón en poder de la interfaz.

+2

Eso no me dice donde el tipo concreto de este error es retenida. –

Cuestiones relacionadas