2010-03-25 13 views
5

मैं डीबग मोड में विजुअल स्टूडियो में यह सी # कोड चला रहा हूं:जब मेरा अपवाद स्थिर कन्स्ट्रक्टर में होता है तो विजुअल स्टूडियो एक अपवाद संदेश क्यों नहीं दिखाता है?

public class MyHandlerFactory : IHttpHandlerFactory 
{ 
    private static Dictionary<string, bool> myDictionary = new Dictionary<string, bool>(); 
    static MyHandlerFactory() 
    { 
    myDictionary.Add("someKey",true); 
    myDictionary.Add("someKey",true); // fails due to duplicate key 
    } 
} 

स्थिर कन्स्ट्रक्टर के बाहर, जब मैं त्रुटि के साथ लाइन पर जाता हूं विजुअल स्टूडियो इसे हाइलाइट करता है और अपवाद के बारे में एक संदेश पॉप अप करता है। लेकिन स्थिर रचनाकार में मुझे ऐसा कोई संदेश नहीं मिला है। मैं लाइन-बाय-लाइन के माध्यम से कदम उठा रहा हूं, इसलिए मुझे पता है कि मैं उस रेखा पर जा रहा हूं और आगे नहीं।

यह क्यों है?

(मुझे यह नहीं पता कि मेरी कक्षा IHttpHandlerFactory मामलों को लागू करती है, लेकिन मैंने इसे केवल मामले में शामिल किया है।)

यह वीएस2005 है, नेट 2.0

संपादित करें: मुझे बस चाहिए जोड़ने के लिए, तथ्य यह है कि यह एक HttpHandler है मायने रखता है। चूंकि उत्तरों ने संकेत दिया है, डिफ़ॉल्ट व्यवहार आंतरिक अपवाद के बजाय TypeInitializationException को तोड़ना है। मैंने HttpHandler के बिना एक और उदाहरण का परीक्षण किया और देखा कि इस कार्यक्रम ने कक्षा का उपयोग करने वाली पहली पंक्ति को तोड़ने का कारण बना दिया। लेकिन इस मामले में तोड़ने के लिए मेरे कोड में कोई लाइन नहीं है, क्योंकि कक्षा को केवल मेरी वेब.कॉन्फिग फ़ाइल में निर्दिष्ट एक HttpHandler के रूप में जाना जाता था। इसलिए, यह अपवाद पर बिल्कुल नहीं टूट गया।

उत्तर

9

समस्या यह है कि अपवाद फेंक दिया गया वास्तव में एक TypeInitializationException है जो जो भी अपवाद फेंक दिया जाता है उसे लपेटता है। मुझे यकीन नहीं है कि डिज़ाइन ट्रेडऑफ ने इसका कारण क्यों बनाया है, लेकिन आईएमओ यह .NET विकास में सबसे कष्टप्रद चीजों में से एक है, और मुझे यह देखकर दुख हुआ कि यह अभी भी .NET 4.

वीएस में पकड़ने के लिए है अपवाद ASAP, आपको पहले-अवसर अपवादों को चालू करने की आवश्यकता होगी। डीबग> अपवादों पर जाएं और "सामान्य भाषा रनटाइम अपवाद" की जांच करें, जो जल्द ही एक अपवाद फेंक दिया जाएगा।

(नोट: यदि आप डायनामिक लैंग्वेज रनटाइम का उपयोग कर रहे हैं, तो आपको अपवादों के बारे में और अधिक चुनौतीपूर्ण होने की आवश्यकता होगी, क्योंकि यह स्पष्ट रूप से प्रवाह नियंत्रण के लिए अपवादों का उपयोग करता है)।

+0

उत्तर में धन्यवाद के बारे में एक उत्कृष्ट चर्चा है। हालांकि, डीबग> अपवादों में जो विकल्प मैं देखता हूं ... "सी ++ अपवाद", "सामान्य भाषा रनटाइम अपवाद", "प्रबंधित डिबगिंग सहायक", "मूल रन-टाइम चेक" और "Win32 अपवाद" हैं। इनमें से एक के तहत "नेट अपवाद" है? मुझे यह नहीं मिला। –

+0

@ टिम गुडमैन - ओओपीएस! मेरा मतलब था "आम भाषा रनटाइम अपवाद"। मैं अपना जवाब अपडेट करूंगा। –

+0

आह हां, जब इसे आम भाषा रनटाइम अपवादों को फेंक दिया जाता है तो इसे तोड़ना पड़ता है क्योंकि यह आंतरिक अपवाद को तोड़ देता है। धन्यवाद। –

1

मैंने आपके कोड की कोशिश की और मुझे टाइपइनिलाइजेशन एक्सेप्शन मिला जैसा आपने अपेक्षित था। मेरे वीएस में कोई समस्या नहीं ...

लेकिन यदि आप इसे (या कोई अन्य) एप्लिकेशन 'डिबगिंग के बिना' चलाते हैं, तो आपको हमेशा किसी भी अनचाहे अपवादों के लिए एक त्रुटि संदेश प्राप्त करना चाहिए - कोई वीएस सेटिंग्स यहां कोई फर्क नहीं पड़ेगी।

+0

आपको TypeInitializationException किस लाइन पर मिला? मैं अब सोच रहा हूं कि मुद्दा यह है कि यह कक्षा को संदर्भित करने के लिए पहली पंक्ति में एक त्रुटि देगा (जिसने स्थिर कन्स्ट्रक्टर को बुलाया है), लेकिन इस मामले में इसे एक HttpHandler कहा जा रहा है, इसलिए कोई लाइन नहीं है के लिए जाओ। –

+0

TypeInitializationException उस रेखा पर दिखाई देता है जहां मैं कक्षा का एक नया उदाहरण बनाता हूं: MyHandlerFactory factory = new MyHandlerFactory(); लेकिन मैंने इसे इंटरफ़ेस के बिना कोशिश की जो इसे प्राप्त करता है। हो सकता है कि आप नमूना बढ़ा सकें कि हम इसे आपके कोड में उतनी ही जांच सकते हैं जितना कि यह आपके कोड में है। – Machta

+0

आज मैं इस 7 साल के प्रश्न को फिर से देखने के लिए हुआ, इसलिए मुझे लगा कि मैं आपकी टिप्पणी का जवाब दूंगा। :) इस मुद्दे को पुन: पेश करने के लिए मेरा मानना ​​है कि HTTP हैंडलर को ASP.NET वेब अनुप्रयोग के Web.config में पंजीकृत करना आवश्यक था (यहां देखें: https://msdn.microsoft.com/en-us/library/46c5ddfy। एएसपीएक्स) और वेब ऐप के पेज को लोड करने का प्रयास करके इसे एक्सेस करें। –

0

आपके एप्लिकेशन को एपडोमेन में चलने से पहले स्थैतिक कन्स्ट्रक्टर चलाया जाता है। यह शायद वीएस अपवाद को पकड़ने के तरीके के साथ मुद्दों का कारण बन रहा है, जो आपके विवरण से काफी मानक है। यह 2005 की सीमा हो सकती है। यही कारण है कि आपको हमेशा स्थिर कन्स्ट्रक्टर के शरीर में पकड़ना चाहिए। नई पुस्तक प्रभावशाली सी #

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