Filtrar errores de tubería rota
Frecuentes
Visto 7,544 veces
13
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...
3 Respuestas
19
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
10
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
-1
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 io go system-calls broken-pipe epipe or haz tu propia pregunta.
Esto parece un ganador, lo intentaré. - carpintero mate
Sí lo hizo. Además, tuve que escribir afirmaciones para
net.OpError
primero, luego compararopErr.Err == syscall.EPIPE
. - carpintero mate