2011-01-29 23 views
8

मैंने कुछ शुरुआती परिचय को छोटे-छोटे से पढ़ा है और एक विषय गायब है। यह त्रुटि प्रबंधन है। यह कैसे किया जाता है? क्या वस्तुएं कुछ प्रकार के अपवाद फेंकती हैं? किसी को कुछ त्रुटि संदेश भेजें?स्मॉलटॉक त्रुटि हैंडलिंग

उत्तर

19

एक अपवाद को बढ़ाने के लिए:

[ 1/0 ] on: ZeroDivide do: [ Transcript showln: 'Oops! Zero divide!']. 

एक अपवाद को संभालने और अपवाद की जानकारी से कुछ का उपयोग करने के लिए::

[ 1/0 ] on: Error do: 
    [:e | Transcript showln: 'Oops! ' , e className , '!']. 

कुछ सुनिश्चित करने के लिए

MyException signal. 
MyException signal: 'With an error message'. 

एक अपवाद को संभालने के लिए हमेशा होता है (एक ला try finally):

[ 1/0 ] ensure: [ Transcript showln: 'This will always run' ] 
5

मैं बस यह इंगित करना चाहता हूं कि @ फ्रैंक शीयर के रास्ते के अलावा एक और संभावना है। मेरा मतलब डिजाइन द्वारा है। कभी-कभी कॉलर को फेंकने के लिए और अधिक उपयोगी होता है कि अब क्या परेशानी फेंक रही है।

#on:do: पूरी तरह स्वीकार्य है लेकिन अधिकांश समय आपको नहीं पता कि पहले तर्क के रूप में क्या रखा जाए। block on: ?? do: something

मुझे एक उदाहरण लेते हैं। दरअसल संग्रह पुस्तकालय से एक उदाहरण है। विशेष रूप से शब्दकोश के बारे में।

aDict at: 4 

यहां क्या होता है यदि 4 शब्दकोश में नहीं है। आपको बस एक सादा त्रुटि मिलती है जिसे आपको #on:do: में पकड़ने की आवश्यकता है।

aDict at: 4 ifAbsent: [^#noSuchThingAs4] 

आपको त्रुटि #on:do: रूप में एक ही संभाल रहे हैं, लेकिन अब तुम जानते हो क्यों:

लेकिन इस स्थिति से निपटने के लिए एक बेहतर तरीका है। तो आप अपनी त्रुटि को सही तरीके से संभालने के लिए दूसरे में ऐसा कर सकते हैं।

aConnection connectIfFailed: [ ^#maybeRetryHere ] 

ध्यान रखें कि आपको एक ब्लॉक में अपवाद कोड डालना होगा ताकि त्रुटि होने तक इसका मूल्यांकन नहीं किया जा सके।

aDict at: 4 ifAbsentPut: self default 

काम कर सकता है लेकिन यह गलत है। उम्मीद है कि आपकी मदद करो।

+1

अच्छा बिंदु: त्रुटि हैंडलिंग अक्सर ifAbsent ढंग से एपीआई में शामिल किया हुआ। –

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