2012-06-12 28 views
9

Hedef olarak bir soket (TCPConn) ilettiğim bir io.Copy çağrısından dönen bir error alıyorum. Uzaktaki ana bilgisayarın bağlantıyı yeterli hale getirmesi beklenir ve onlardan hiçbir şey almadım. Damla oluştuğundaBozuk boru hatalarını filtrele

, bu hatayı alıyorum:

write tcp 192.168.26.5:21277: broken pipe 

Ama elimdeki bütün bir error arayüzüdür. Bozuk boru hatalarını diğer hata türlerinden nasıl ayırt edebilirim?

if err.Errno == EPIPE... 

cevap

12

Bozuk boru hatası syscall paketinde tanımlanmıştır. Hatayı syscall'takiyle karşılaştırmak için eşitlik operatörünü kullanabilirsiniz. Syscall hatalarının tam listesi için http://golang.org/pkg/syscall/#constants'u kontrol edin. Sayfada "EPIPE" yi aradığınızda, birlikte tanımlanan tüm tanımlanmış hataları bulacaksınız.

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

Eğer bir tür belirtilme kullanabilirsiniz (oldukça işe yaramaz rağmen) gerçek errno numarası almak istediğinizde: Bu hatanın somut tip nerede olduğunu söylemez

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

Bu kazanan gibi görünüyor, ben bir şeyler vereceğim. –

+0

Syscall.EPIPE ile karşılaştı mı? –

+5

Evet öyle yaptı. Buna ek olarak, önce "net.OpError" yazıp, sonra "opErr.Err == syscall.EPIPE" yi karşılaştırdım. –

-1

tümüne sahip ancak error arayüzü tip onaylama işlemi veya arayüz tarafından tutulan beton türü ortaya çıkarmak için bir tür geçiş yapmak için yeterlidir.

+2

düzenledi. –