2013-12-10 28 views
7

में सुरक्षित बंद कनेक्शन जब मैं सॉकेट कनेक्शन खोलता हूं, तो मैंने तुरंत सॉकेट डाल दिया। सॉकेट खोलने के बाद एक डिफर फ़ंक्शन में लॉजिक() लॉजिक करें। हालांकि, क्या होगा यदि सॉकेट। क्लोज़() एक और दहशत पैदा करेगा? क्या मुझे अपने प्रोग्राम को दुर्घटनाग्रस्त होने से रोकने के लिए बाहरी अवरोधक के अंदर हमेशा एक और स्थगित/पुनर्प्राप्त करना चाहिए? कुछ इस तरह: http://play.golang.org/p/GnEMQS-0jjगोलांग

धन्यवाद, Elgs

+2

सॉकेट। बंद करें() एक आतंक आईआईआरसी का कारण नहीं बन सकता है। – fuz

+2

मुझे पूरी तरह से यकीन नहीं है: बंद करें (उदा। Net.CPConn) के परिणामस्वरूप एक त्रुटि हो सकती है लेकिन मुझे लगता है कि यह घबराहट नहीं करता है। और अगर यह आतंक, उदाहरण के लिए हार्डवेयर भ्रष्टाचार या स्मृति से बाहर आपके ऐप को वैसे भी उड़ा दिया जाता है। आपके मामले के आधार पर आप लौटाई गई त्रुटि को संभालना चाहते हैं, लेकिन बंद में एक आतंक को संभालना थोड़ा सा परावर्तक लगता है। – Volker

+0

@FUZxxl जब मैं क्लाइंट सॉकेट को बंद करने का प्रयास करता हूं जिसे सर्वर से कनेक्ट करने से इंकार कर दिया जाता है, तो यह पैनिक्स है। क्या यह बताने का कोई तरीका है कि बिना किसी घबराहट के बंद करने के लिए सॉकेट सुरक्षित है या नहीं। या मुझे सॉकेट क्लोज लॉजिक के लिए केवल एक और स्तर के डिफर को घोंसला करना है। –

उत्तर

7

आम तौर पर आप घबरा के बारे में ज्यादा चिंता करने की जरूरत नहीं है। वे आम तौर पर त्रुटियों के दो वर्गों का प्रतिनिधित्व करते हैं: डेवलपर गलतियों (शून्य संदर्भ, सीमाओं से बाहर सरणी) और सिस्टम स्तर की त्रुटियों के बारे में आप शायद अधिक कुछ नहीं कर सकते (जैसे स्मृति से बाहर चलना)।

जैसा कि अन्य ने कहा socket.Close घबराएगा, बल्कि यह एक त्रुटि देता है। यदि आप कार्य करें:

defer socket.Close() 

त्रुटि खारिज कर दिया है और आप कुछ और करने की जरूरत नहीं है।

लेकिन मान लीजिए कि आप एक आतंक से ठीक होना चाहते हैं। आप कर रहे हैं वसूली हैंडलर तो पहले स्थगित कर रहा है, तो आप कुछ और करने की जरूरत नहीं है:

func main() { 
    defer func() { 
    if err := recover(); err != nil { 
     fmt.Println(err) 
    } 
    }() 
    defer panic("this will be recovered") 
} 

स्थगित कार्यों उलटे क्रम में चलाए जा रहे हैं: http://golang.org/ref/spec#Defer_statements

स्थगित कार्यों आसपास से ठीक पहले क्रियान्वित कर रहे हैं फंक्शन रिटर्न, रिवर्स ऑर्डर में उन्हें स्थगित कर दिया गया था।