2012-09-16 12 views
5

वहाँ डेल्फी में दो कोडिंग पैटर्न के बीच किसी भी व्यावहारिक अंतर:एक कोशिश-अंतराल ब्लॉक को कोशिश करने के साथ-साथ अवरुद्ध करने के बीच क्या अंतर है और इसके विपरीत?

संस्करण 1

try 
    try 
    {Do something} 
    finally 
    {Do tidy up} 
    end 
except 
    {Handle exception} 
end; 

संस्करण 2

try 
    try 
    {Do something} 
    except 
    {Handle exception} 
    end 
finally 
    {Do tidy up} 
end; 
+5

एक तरफ, मुझे अंततः ब्लॉक से संबंधित एक बदसूरत x64 बग मिला जिसका मतलब है कि उन्हें दो बार बुलाया जा सकता है! http://qc.embarcadero.com/wc/qcmain.aspx?d=108457 –

+0

कोड यह नहीं दिखाता है कि संरक्षित संसाधन आवंटित किया गया है (SomeObject.Create)। क्या यह 'कुछ करें' भाग में या पहले है? – mjn

+0

यह दुर्भाग्यपूर्ण है कि 'आखिरकार' ब्लॉक और 'सिवाय' ब्लॉक दोनों ही 'try' कीवर्ड के साथ पेश किए जाते हैं क्योंकि वे अन्यथा ऑर्थोगोनल अवधारणाएं हैं। –

उत्तर

6

दो मतभेद हैं:

  1. रिश्तेदार क्रम जिसमें छोड़कर और आखिरकार निष्पादित ब्लॉक अलग-अलग होते हैं। संस्करण 1 में, अंततः छोड़कर पहले निष्पादित करता है। संस्करण 2 में excecution आदेश उलट दिया गया है।
  2. संस्करण 1 में, यदि अंत में ब्लॉक बढ़ता है, तो इसे ब्लॉक को छोड़कर संभाला जाएगा। संस्करण 2 में, यदि अंत में ब्लॉक बढ़ता है, तो इसे अगले कोड अपवाद हैंडलर द्वारा संभाला जाएगा, यानी इस कोड के बाहर।

आमतौर पर आप अंततः ब्लॉक को बढ़ाने के बारे में चिंतित नहीं हैं। आप बस ऐसा होने की अपेक्षा नहीं करते हैं और यदि ऐसा होता है, तो शायद कुछ तोड़ दिया जाता है।

तो अंतर यह है कि अंततः अपवाद हैंडलर से पहले चलता है या इसके विपरीत। कभी-कभी इससे कोई फर्क नहीं पड़ता, लेकिन यह अक्सर एक फर्क पड़ता है।

2

जब आप try..except का उपयोग निष्पादित लाइनों के नीचे करते हैं।

Resource := TAbstractResource.Create; 
try 
    Resource.DoSomeThing; 
except 
    On E:Exception Do 
    HandleException(E); 
end; 
FreeAndNil(Resource); 
+0

मैं नहीं देख सकता यह सवाल से संबंधित है, या वास्तव में कुछ भी। और भी, सबसे अच्छा अभ्यास संसाधनों की सुरक्षा के लिए अंततः उपयोग करना है और अपवादों को उच्च स्तर कोड पर जाने दें। –

+1

मुझे लगता है कि उत्तरदाता का अर्थ है कि यदि आप 'छोड़कर' ब्लॉक में कोई अपवाद संभालते हैं तो आपको 'अंत में' ब्लॉक की आवश्यकता नहीं है। – kludg

+0

@ सर्ज ठीक है, जो समझ में आता है। हालांकि, अगर मैं कभी मेरे सामने रखता हूं तो भी मैं इस कोड को अस्वीकार कर दूंगा। प्रयास करें/आखिरकार संसाधनों की रक्षा कैसे करें और जब मैं कोशिश करता/अंत में, मुझे पता है इसका क्या अर्थ है। जब मैं इसे नहीं देखता तो मुझे सोचना पड़ता है। –

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