2012-03-23 17 views
5

मैंने एक सिद्धांत का परीक्षण करने के लिए एक सरल कार्यक्रम लिखा था कि "आखिरकार" ब्लॉक हमेशा कोई फर्क नहीं पड़ता कि क्या होगा। लेकिन, मैं नीचे दिए गए पीजीएम से जो देख रहा हूं वह यह है कि नियंत्रण बाहरी फाइनली ब्लॉक में प्रवेश नहीं करता है।अंदरूनी "पकड़" फेंकने पर बाहरी "अंततः" निष्पादित क्यों नहीं किया जा रहा है?

मैंने विजुअल स्टूडियो में F5 और Ctrl-F5 करने का प्रयास किया और यह वही परिणाम है।

क्या कोई यह समझा सकता है कि मैं यह व्यवहार क्यों देख रहा हूं? कंसोल विंडो पर

आउटपुट है:

भीतरी पकड़

भीतरी अंत में

बाहरी पकड़

बिना क्रिया अपवाद:

..और तो अनुप्रयोग क्रैश हो

public class Program 
{ 
    static void Main() 
    { 
     try 
     { 
      try 
      { 
       string s = null; 
       s.ToString(); 
      } 
      catch 
      { 
       Console.WriteLine("inner catch"); 
       throw; 
      } 
      finally 
      { 
       Console.WriteLine("inner finally"); 
      } 

      return; 
     } 
     catch 
     { 
      Console.WriteLine("outer catch"); 
      throw; 
     } 
     finally 
     { 
      Console.WriteLine("outer finally"); 
     } 
    } 
} 

उत्तर

7

अपवाद संभालने के ठीक बाद "बाहरी अंत में" चलाया जाता है।

 
inner catch 
inner finally 
outer catch 

Unhandled Exception: System.NullReferenceException: Object reference not set to 
an instance of an object. 
    at SOConsole.Program.Main() in c:\Users\DaveShaw\Documents\Visual Studio 11\Pro 
jects\SO\SOConsole\Program.cs:line 35 
outer finally 
Press any key to continue . . . 

जब अपवाद घटित निम्नलिखित प्रदर्शित किया गया था:

यहाँ डिबगर के बाहर इस कोड को चलने से उत्पादन होता है Exception

बाद मैं क्लिक किया "रद्द करें", आवेदन फिर से शुरू किया और "बाहरी अंत में" प्रदर्शित किया।

अगर किसी कारण से आप "बाहरी अंत में" प्रवेश करने का मौका देने से पहले अपना आवेदन बंद कर देते हैं तो आपको कभी संदेश नहीं दिखाई देगा। यदि किसी एप्लिकेशन की प्रक्रिया को "समाप्त" किया जाता है तो आखिर में कोड को शामिल किया जाता है, जिसमें कोड शामिल होता है जो एप्लिकेशन को बंद होने से रोकता है। अन्यथा उस प्रक्रिया को समाप्त करना असंभव हो सकता है।

+0

ओह ठीक है। रद्द करने पर क्लिक करने से "बाहरी अंत में: कथन दिखाया जाता है। इसे जानने के लिए अच्छा। धन्यवाद – user330612

4

आवेदन से पहले समाप्त होने की संभावना है stdout बफर flushed है।

या तो करने के लिए बाहरी-अंत में (WriteLine पर) एक ब्रेक सूत्री जोड़ने के लिए या पुष्टि करने के लिए से बाहरी-अंत में एक अलग अपवाद फेंक देते हैं। finally छोड़ दिया गया है: ऐसा करना एक गंभीर बग होगा!

+1

+1 या अंत में एक पाठक करें। – Craig

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