2011-10-20 14 views
5

में कोशिश-अंत-अंत में मुहावरे आप छोटे-छोटे में कोशिश करने वाले अंततः मुहावरे को कैसे महसूस करते हैं? मुझे लगता है कि on:do: और ensure: है, लेकिन on:do:ensure: नहीं है। मेरा कुछ छूट रहा है।स्मॉलटॉक

उत्तर

6

आप #on को लपेट सकते हैं: # अवरोध वाले ब्लॉक में ब्लॉक करें: इससे जुड़ा हुआ है।

+0

वास्तव में आह। मैंने इसके बारे में सोचा लेकिन किसी भी तरह मैंने सोचा कि यह आंतरिक ब्लॉक को दो बार निष्पादित करेगा, क्योंकि #on: do: और #ensure: #value भेजें। – milan

+1

'# लाइसेंस:' 'value' का प्रेषण इसकी सामग्री का मूल्यांकन करेगा, जो इसकी सामग्री के लिए '#on: do:' भेज देगा, जो बदले में '# मान' को सबसे निचले ब्लॉक पर भेज देगा, जो आखिरकार होगा कुछ उपयोगी करो। दूसरे शब्दों में, दो '# मूल्य' भेज अलग-अलग ब्लॉक पर भेजे जाते हैं। –

1

मुझे यकीन है कि मैं अपने प्रश्न समझ में आया, लेकिन अगर मैंने किया था और आप का मतलब है "अगर यह शुरू हो रहा है कि कैसे एक एक अपवाद को संभालने और अन्यथा सामान्य निष्पादन जारी रखने के लिए करता है", यह आप क्या कर सकते हैं नहीं कर रहा हूँ:

[self doWhatever] on: SomeException do: [self handleSomeException]. 
self continueNormally. 

अपवाद के सभी उप-वर्गों को देखें कि आप किस प्रकार के अपवादों को कैप्चर कर सकते हैं।

आशा है कि इससे मदद मिलेगी!

+0

आखिरकार ब्लॉक न केवल निष्पादित होता है जब निष्पादन सामान्य रूप से जारी रहता है, लेकिन जब अपवाद छोटे स्टैक # सेंसर जैसे स्टैक को अनलॉक करता है:। अन्य उत्तरों देखें। –

5

तुम सच में इसकी जरूरत है, तो आप BlockClosure के लिए एक प्रोटोकॉल जोड़ सकते हैं:

#on: anErrorOrSet do: errorBlock ensure: finallyBlock 
    [ self on: anErrorOrSet do: errorBlock ] 
    ensure: finallyBlock 

कि सिर्फ कोशिश की तरह बर्ताव करेंगे: पकड़: अंत में: जावा पर।

, (यह एक छोटा सा हिस्सा ठीक है,) smalltalk का जादू है कि अगर वहाँ अपनी आवश्यकताओं के लिए कोई मुकाबला नहीं है, तो आप हमेशा यह विस्तार कर सकते हैं :)

1

इस तरह आप यह बॉक्स से बाहर लिख सकते हैं लगभग सभी स्मॉलटाक बोलियों में।

[[ "try{}" ] 
    on: Error 
    do: [:ex | "catch{}"]] 
     ensure: ["finally{}"] 

या आप ब्लॉकक्लोजर को @EstebanLM के रूप में अनुशंसित कर सकते हैं।

संबंधित मुद्दे