Filtrar errores de tubería rota

Estoy recibiendo un error regresado de un io.Copy llamada, a la que he pasado un socket (TCPConn) como destino. Se espera que el host remoto simplemente corte la conexión cuando haya tenido suficiente, y no estoy recibiendo nada de ellos.

Cuando se produce la caída, aparece este error:

write tcp 192.168.26.5:21277: broken pipe

Pero todo lo que tengo es un error interfaz. ¿Cómo puedo diferenciar los errores de tubería rota de otros tipos de errores?

if err.Errno == EPIPE...

preguntado el 12 de junio de 12 a las 20:06

3 Respuestas

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. Cheque http://golang.org/pkg/syscall/#constants para obtener una lista completa de errores de llamada al sistema. Busque "EPIPE" en la página y encontrará todos los errores definidos agrupados.

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

Si desea obtener el número de error real (aunque es bastante inútil), puede usar una afirmación de tipo:

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

Respondido el 12 de junio de 12 a las 22:06

Esto parece un ganador, lo intentaré. - carpintero mate

Sí lo hizo. Además, tuve que escribir afirmaciones para net.OpError primero, luego comparar opErr.Err == syscall.EPIPE. - carpintero mate

A partir de go 1.13, puede usar errores.es en lugar de aserciones de tipo.

if errors.Is(err, syscall.EPIPE) {
  // broken pipe
}

Respondido 03 Oct 19, 23:10

Tener todo menos un error interfaz es suficiente para realizar una aserción de tipo o un cambio de tipo para revelar el tipo concreto que tiene la interfaz.

Respondido el 12 de junio de 12 a las 20:06

Eso no me dice dónde se encuentra el tipo concreto de este error. - carpintero mate

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.