2012-06-12 20 views
9

मुझे errorio.Copy कॉल से लौटा रहा है, जिस पर मैंने गंतव्य के रूप में सॉकेट (TCPConn) पारित किया है। यह अपेक्षा की जाती है कि रिमोट होस्ट बस पर्याप्त होने पर कनेक्शन छोड़ देगा, और मुझे उनसे कुछ भी प्राप्त नहीं हो रहा है।टूटी हुई पाइप त्रुटियों को फ़िल्टर करें

जब ड्रॉप होता है, मैं इस त्रुटि मिलती है:

write tcp 192.168.26.5:21277: broken pipe 

लेकिन सब मेरे पास है एक error इंटरफेस है। मैं अन्य प्रकार की त्रुटि से टूटी हुई पाइप त्रुटियों को कैसे अलग कर सकता हूं?

if err.Errno == EPIPE... 

उत्तर

12

टूटा पाइप त्रुटि syscall पैकेज में परिभाषित की गई है। आप syscall में त्रुटि की तुलना करने के लिए समानता ऑपरेटर का उपयोग कर सकते हैं। Syscall त्रुटियों की पूरी सूची के लिए http://golang.org/pkg/syscall/#constants देखें। पृष्ठ पर "EPIPE" खोजें और आपको एक साथ समूहीकृत सभी परिभाषित त्रुटियां मिलेंगी।

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

आप वास्तविक errno संख्या प्राप्त करने के (हालांकि यह बहुत बेकार है) चाहते हैं तो आप एक प्रकार दावे का उपयोग कर सकते हैं:

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

यह एक विजेता की तरह दिखता है, मैं एक जाऊंगा। –

+0

इसे syscall.EPIPE काम से तुलना कर रहा था? –

+5

हां यह किया। इसके अलावा मुझे पहले 'net.OpError' टाइप करना था, फिर' opErr.Err == syscall.EPIPE' की तुलना करें। –

-1

लेकिन सभी के बाद एक error इंटरफ़ेस एक प्रकार दावे या एक प्रकार स्विच इंटरफ़ेस द्वारा आयोजित ठोस प्रकार प्रकट करने के लिए प्रदर्शन करने के लिए पर्याप्त है।

+2

जो मुझे नहीं बताता है जहां इस त्रुटि के लिए ठोस प्रकार है का आयोजन किया। –