2009-10-16 12 views
17

मान लें आप निम्नलिखित कोड है:अपवाद हैंडलिंग: अंत में फेंकने के बाद निष्पादित किया जाता है?

के बजाय कर रही है:

Try 
    ' 
    ' Initialize some objects 
    ' 

    ' 
    ' do something that fails 
    ' 

    ' 
    ' Clean up-code that gets not reached because exception 
    ' 
Catch e As Exception 
    ' 
    'Clean up initialized objects 
    ' 

    Throw e 
End Try 

मैं चाहूँगा करने के लिए:

Try 
    ' 
    ' Initialize some objects 
    ' 

    ' 
    ' do something that fails 
    ' 
Catch e As Exception 
    Throw e 
Finally 
    ' 
    'Clean up initialized objects 
    ' 
End Try 

तो मेरी सरल सवाल है: में एक अपवाद के मामले है आखिर में कुछ लाइनें फेंकने पर भी ब्लॉक पहुंच गया?

[संपादित करें] आपके तेज़ उत्तरों के लिए धन्यवाद।

पहली पंक्ति में NullReference-, COM- और FileNotFound-Exceptions मुझे लगता है।

ठीक है, मैं इस कोड के लिए जाना होगा:

Try 
    ' 
    ' Initialize some objects 
    ' 

    ' 
    ' do something that fails 
    ' 
Catch e As Exception  ' or just "Catch"??   
    Throw 
Finally 
    ' 
    'Clean up initialized objects 
    ' 
End Try 

शुभकामनाएँ!

Inno

+2

आपको 'थ्रो ई' नहीं लिखना चाहिए बल्कि' थ्रो 'लिखना चाहिए। अन्यथा, आप अपवाद स्टैक ट्रेस को रीसेट करते हैं, इसलिए आप इस बारे में जानकारी खो देते हैं कि अपवाद को –

उत्तर

25

तो मेरी सरल सवाल यह है: में एक अपवाद के मामले अंत में पहुँच भले ही एक थ्रो कुछ लाइनों से पहले है ब्लॉक है?

हां। Finally blockहमेशा1) निष्पादित और साफ-सफाई के लिए ठीक है। अपने कोड में, Catch ब्लॉक हटाएं, यह कुछ भी नहीं करता है। इससे भी बदतर, यह वास्तव में स्टैक ट्रेस को नष्ट कर देता है क्योंकि आप मूल अपवाद को फिर से फेंक नहीं देते हैं, आप एक नया फेंक देते हैं।

Catch e As XyzException 
    ' … do some stuff. ' 
    Throw 
End Try 

1):

तुम सच में एक Catch ब्लॉक है कि तब फिर से फेंकता अपवाद की जरूरत है, निम्न का उपयोग चेतावनी emptor: (कैसे इस तरह के StackOverflowException के रूप में कुछ अपवाद हैं फिटिंग ...) जिसके लिए विशेष ध्यान देने की आवश्यकता है और Finally ब्लॉक को ट्रिगर नहीं कर सकता है। उन्हें सही ढंग से संभालना आमतौर पर काफी कठिन होता है।

+1

कोनराड कहां से उठाया गया था - अंत में हमेशा निष्पादित नहीं होता है। उदाहरण के लिए आउटऑफमेमरी अपवाद होने पर इसे निष्पादित नहीं किया जाएगा। –

+0

@Pete: ठीक है, लेकिन ये विशिष्ट किनारे के मामले हैं (लेकिन मुझे उनका उल्लेख करना चाहिए था)। –

+1

@Pete: क्या आपका मतलब StackOverflowException नहीं है। आउटऑफमेमरी अपवाद के मामले में आखिरकार एक परीक्षण करना आसान है। –

0

हां यह करता है, आखिर में किसी भी मामले में निष्पादित किया जाता है। (केवल कुछ अपवाद हैं - Response.Redirect और मल्टीथ्रेडिंग के साथ कुछ मामले)

5

नहीं, यह चलाने की गारंटी नहीं है। कुछ अपवाद हैं - उदाहरण के लिए StockOverflowException और OutOfMemoryException - जहां अंत में ब्लॉक का निष्पादन की गारंटी नहीं है।

1

लगभग सभी मामलों में, अंततः एक कोशिश/पकड़ ब्लॉक में निष्पादित होगा (उल्लेखनीय अपवाद भी शामिल हैं जब एक स्टैक ओवरफ्लो एक्सेप्शन या आउटऑफमेमरी अपवाद होता है)। हालांकि मैं उत्सुक हूं, आपने अपने लिए यह क्यों नहीं किया। चीजों को सीखने का एक मूल्यवान तरीका वास्तव में उन्हें अपने लिए बाहर निकालना है - आखिरकार, आप गलत या भ्रामक उत्तर देने वाले व्यक्ति को स्वीकार कर सकते हैं, और आप इस झूठ के नीचे उस बिंदु से श्रम करेंगे।

+1

मैंने इसे आजमाया लेकिन मेरा डीबगर फेंकने से रोक दिया। मैंने प्रलेखन पढ़ा और मुझे अपने प्रश्न के लिए संकेत नहीं मिला। मैंने इस प्रश्न से सीधे मेरे प्रश्न से संबंधित उत्तर प्राप्त करने के लिए कहा और अप्रत्यक्ष रूप से इसके बारे में पूछा (जैसे अंततः "विशेष परिस्थितियों में निष्पादित नहीं है" जैसे संकेत। – Inno

1

नोट: सिस्टम। पर्यावरण। फास्टफेल विधि वर्तमान प्रक्रिया/थ्रेड को तत्काल अनुभाग निष्पादित किए बिना तुरंत प्रक्रिया/थ्रेड को मार डाला गया था।

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