2011-02-01 15 views
5

संभव डुप्लिकेट सी # में ब्लॉक:
Finally Block Not Running??अंत में

मैं अंत में सी # में ब्लॉक से संबंधित प्रश्न है। अब तक

public class MyType 
{ 
    public void foo() 
    { 
     try 
     { 
      Console.WriteLine("Throw NullReferenceException?"); 
      string s = Console.ReadLine(); 
      if (s == "Y") 
       throw new NullReferenceException(); 
      else 
       throw new ArgumentException();   
     } 
     catch (NullReferenceException) 
     { 
      Console.WriteLine("NullReferenceException was caught!"); 
     } 
     finally 
     { 
      Console.WriteLine("finally block"); 
     } 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     MyType t = new MyType(); 
     t.foo(); 
    } 
} 

मैं के रूप में के रूप में मैं जानता हूँ कि, अंत में deterministicly चलाने के लिए लगता है कि ब्लॉक, चाहे या नहीं एक अपवाद उत्पन्न हुआ था: मैं एक छोटा सा नमूना कोड लिखा था। अब, यदि उपयोगकर्ता "वाई" में प्रवेश करता है - NullReferenceException फेंक दिया जाता है, तो निष्पादन कैच घड़ी पर जाता है और फिर अंततः ब्लॉक की अपेक्षा करता है। लेकिन अगर इनपुट कुछ और है - ArgumentException फेंक दिया गया है। इस अपवाद को पकड़ने के लिए कोई उपयुक्त पकड़ ब्लॉक नहीं है, इसलिए मैंने सोचा कि निष्पादन अंततः ब्लॉक को ले जाना चाहिए - लेकिन यह नहीं करता है। क्या कोई मुझे बता सकता है क्यों?

धन्यवाद हर कोई :)

+2

संभावित डुप्लिकेट: http://stackoverflow.com/questions/4193493/finally-block-not-running –

+2

मैंने कोड की कोशिश की है, और यह अंततः – SWeko

+0

अपेक्षित ब्लॉक में प्रवेश करता है क्या आप स्पष्ट कर सकते हैं कि आपका क्या मतलब है ' मैंने सोचा कि निष्पादन को आखिरकार ब्लॉक को स्थानांतरित करना चाहिए - मुझे लगता है कि नियंत्रण दोनों मामलों में अंततः चल रहा है - है ना? – InSane

उत्तर

6

आपका डिबगर शायद ArgumentException आप अंतिम ब्लॉक में प्रवेश करने से पहले ही "संभाल करने के लिए" के लिए वहाँ तो यह इंतजार कर रहा है बढ़ रहा है। एक संलग्न डीबगर (अपने जेआईटी डीबगर सहित w/o सहित) को अपना कोड चलाएं और इसे आपके अंत में ब्लॉक करना चाहिए।

JIT को अक्षम करने के विकल्प पर जाएँ> टूल> डिबगिंग> बस-इन-टाइम और सही का निशान हटाएँ प्रबंधित

ओ एक संलग्न डिबगर डब्ल्यू/डिबग करने के लिए, दृश्य स्टूडियो में करने के लिए डीबग> प्रारंभ जाना डिबगिंग (या Ctrl + F5)

बिना यह भी अपने कार्यक्रम के अंत में एक Console.ReadLine() डाल करने के लिए अपने अंत में ब्लॉक प्रवेश करने के बाद बंद करने से कंसोल को रोकने के लिए उपयोगी होगा।


फेंक NullReferenceException:

class Program { 
    static void Main(string[] args) { 
     MyType t = new MyType(); 
     t.foo(); 
     Console.ReadLine(); 
    } 
} 

यहाँ उत्पादन आप मिलना चाहिए है? एन

बिना क्रिया के अपवाद: System.ArgumentException: मान पूर्व pected सीमा के भीतर नहीं आता है।

ConsoleSandbox.MyType.foo() पी में कम से

: \ दस्तावेज़ \ सैंडबॉक्स \ कंसोल \ कंसोल \ Consol ई \ Program.cs: लाइन 17

ConsoleSandbox.Program.Main (स्ट्रिंग पर [] args) पी में: \ दस्तावेज़ \ सैंडबॉक्स \ कंसोल \ कंसोल \ कंसोल \ Program.cs: लाइन 31

अंत में ब्लॉक

प्रेस जारी रखने के लिए कोई भी कुंजी। । ।

+0

ठीक है, आप सही हैं। मैंने नहीं सोचा था कि यह डीबगर से संबंधित है क्योंकि मैंने अपवाद विंडो में सीएलआर रनटाइम अपवादों के 'थ्रोउन' और 'यूजर-अनहैंडल' के सभी 4 संयोजनों की कोशिश की थी। क्या वह संबंधित नहीं है? मेरा मतलब है, अगर मैंने उन बक्से को अनचेक किया है, तो कोड को बिना किसी हस्तक्षेप के चलाना चाहिए? धन्यवाद, आपके लिए समय। – meem

+0

आप [डीबग> अपवाद] विकल्पों का जिक्र कर रहे हैं; यह ऊपर उल्लिखित जस्ट-इन-टाइम डीबगर विकल्पों से अलग है। जेआईटी डीबगर अनचाहे अपवादों को पकड़ लेगा जबकि अपवाद विकल्पों का आप उल्लेख कर रहे हैं विजुअल स्टूडियो के संलग्न डीबगर। – bitxwise

+0

समझ गया। धन्यवाद! – meem

1

जो आप देखते हैं वह आपके परीक्षण कार्यक्रम का एक आर्टिफैक्ट है।

आप अपने मुख्य विधि बदलते हैं:

static void Main(string[] args) 
{ 
    try 
    { 
     MyType t = new MyType(); 
     t.foo(); 
    } 
    catch 
    { 
     // write something 
    } 
} 

फिर अपने foo() अपेक्षा के अनुरूप व्यवहार करेंगे।

उस अपरिवर्तनीय प्रयास/पकड़ के बिना, आपका पूरा कार्यक्रम निरस्त किया जा रहा था।

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