Отфильтровывать ошибки сломанной трубы

Я получаюerror вернулся изio.Copy вызов, на который я передал сокет (TCPConn) в качестве пункта назначения. Ожидается, что удаленный хост просто прервет соединение, когда им будет достаточно, и я ничего от них не получу.

Когда происходит падение, я получаю эту ошибку:

write tcp 192.168.26.5:21277: broken pipe

Но все, что у меня есть, этоerror интерфейс. Как я могу отличить ошибки сломанной трубы от других видов ошибок?

if err.Errno == EPIPE...

Ответы на вопрос(2)

error интерфейса достаточно, чтобы выполнить утверждение типа или переключение типа, чтобы выявить конкретный тип, поддерживаемый интерфейсом.

 Matt Joiner12 июн. 2012 г., 22:47
Это не говорит мне, где содержится конкретный тип этой ошибки.
Решение Вопроса

ьзовать оператор равенства для сравнения ошибки с ошибкой в системном вызове. Проверьтеhttp://golang.org/pkg/syscall/#constants для полного списка ошибок системного вызова. Поиск "EPIPE" на странице, и вы найдете все определенные ошибки, сгруппированные вместе.

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

Если вы хотите получить действительное число errno (хотя оно довольно бесполезно), вы можете использовать утверждение типа:

if e, ok := err.(syscall.Errno); ok {
    errno = uintptr(e)
}
 14 июн. 2012 г., 17:51
Работало ли сравнение с syscall.EPIPE?
 Matt Joiner15 июн. 2012 г., 19:06
Да, это так. Кроме того, я должен был напечататьnet.OpError сначала, потом сравниopErr.Err == syscall.EPIPE.
 Matt Joiner12 июн. 2012 г., 22:48
Это выглядит как победитель, я попробую.

Ваш ответ на вопрос