2009-05-27 16 views
6

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

क्या आपके स्रोतों को स्कैन करने और उन सभी कार्यों को टैग करने का कोई आसान तरीका है जो संभावित रूप से अपवाद फेंक सकते हैं?

क्या विज़ुअल सहायता में निर्माण में इन कार्यों को एक विशिष्ट रंग में रंगने के लिए कुछ छुपा विकल्प है?

धन्यवाद

आर

+0

एंडर्स हेजल्सबर्ग के साक्षात्कार के साथ डारीम के लिंक में एक दिलचस्प उद्धरण था जो वास्तव में मेरे बिंदु को समझाता है: "लेकिन कहा, यह जानने में निश्चित रूप से जबरदस्त मूल्य है कि कौन से अपवादों को फेंक दिया जा सकता है, और कुछ प्रकार के उपकरण की जांच होती है। ऐसा नहीं लगता कि हम कठोर और तेज़ नियमों का निर्माण कर सकते हैं, यह या तो एक कंपाइलर त्रुटि है या नहीं। लेकिन मुझे लगता है कि हम विश्लेषण उपकरण के साथ निश्चित रूप से बहुत कुछ कर सकते हैं जो संदिग्ध कोड का पता लगाता है, जिसमें बिना अपवाद अपवाद शामिल हैं, और उन संभावित छेदों को इंगित करता है आपके लिए " – Toad

+0

FxCop ऐसा टूल है, लेकिन afaik यह आपको अपवाद अपवादों के बारे में चेतावनी नहीं देता है .. काफी विपरीत: http://blogs.msdn.com/fxcop/archive/2006/06/14/631923.aspx – VVS

+0

आपके द्वारा लिंक किया गया आलेख भी सामान्य अपवाद खंडों के बारे में बात करता है: पकड़ें (अपवाद ई) और इसे आम तौर पर संभालने का प्रयास करें। वे उन अपवादों को निर्दिष्ट करने का बिंदु बनाते हैं जिन्हें आप सौदा करना चाहते हैं और बाकी प्रवाह को छोड़ दें। मैं पूरी तरह से सहमत हूं, लेकिन मेरा बिंदु अभी भी खड़ा है: कृपया बताएं कि कौन से अपवाद मैंने याद किए हैं और वास्तव में नहीं हैं। अपवाद शिकारी उपकरण वास्तव में ऐसा करने लगता है जो मुझे चाहिए। कल यह देखने के लिए मेरे पास एक खेल होगा कि यह किस तरह का विश्लेषण करता है और यहां रिपोर्ट करता है। – Toad

उत्तर

3

मुझे लगता है कि Redgate इस "अपवाद के लिए कुछ के लिए एक उपकरण है हंटर " वे परीक्षण के बाद इसके लिए चार्ज करते हैं।

http://www.red-gate.com/products/Exception_Hunter/index.htm

+0

टिप के लिए धन्यवाद ... मैं इसे रेडगेट के लिए – Toad

+0

+ 1 की जांच करूँगा, लेकिन बिक्री कॉल के लिए तैयार हूं! मुझे लगता है कि वास्तविक मूल्य सभी संभावित अपवादों के शोर में डूब गया है, लेकिन फिर भी एक सभ्य उपकरण है। – TheMissingLINQ

+0

अपवाद हंटर बंद कर दिया गया है। क्या वहां कोई विकल्प है? – Sugrue

6

सभी कोड लेकिन सबसे छोटी (कम से कम, स्मृति से बाहर) अपवाद फेंक सकता है। माइक्रोमैंज करने की कोशिश करने के बजाए कम से कम एक वैश्विक प्रयास/पकड़ के साथ आप अपने कोड को रक्षात्मक रूप से लिखने से बेहतर तरीके से बेहतर हैं, कोड के कौन से अनुभाग अपवाद फेंकेंगे या नहीं करेंगे।

+2

इन लाइनों के साथ जाकर, सहकर्मी कोड की समीक्षा करें। यहां तक ​​कि एक निर्दोष रेखा जैसे Int32 x = x/y; एक DivideByZero अपवाद फेंक सकता है। सर्वोत्तम अभ्यास यह है कि वे स्वीकार्य श्रेणियों के भीतर हैं, यह सत्यापित करने के लिए सभी इनपुट को सत्यापित करना है; कौन सा कोड विश्लेषण आमतौर पर आपको बताता है। – NotMe

+2

आप लोग कह रहे हैं कि मुझे कोड की प्रत्येक पंक्ति के चारों ओर एक कोशिश/पकड़ना चाहिए, और फिर हो सकता है कि सभी संभव चीजों से निपटें। यह कोड का एक बदसूरत ब्लोब देगा। चलो बस मान लें कि मेमोरी अपवाद जैसे विनाशकारी चीजें नहीं होती हैं (उस स्थिति में आप ईवेंट को लॉगिंग करने के बेहतर और इसे मरने दें), मैं बस कोडिंग के दौरान जानना चाहता हूं कि कौन से तरीके संभावित रूप से (दस्तावेज) दे सकते हैं अपवाद। इसका एक अच्छा उदाहरण Int32.Parse (स्ट्रिंग) है। यह अच्छा होगा अगर वी स्टूडियो किसी भी तरह कहता है: देखो, संभावित रूप से फेंक सकते हैं: शून्य अपवाद या फॉर्मेटेक्सप्शन। और मैं इसे – Toad

+0

@NotMe, Int32 x = x/y से निपट सकता हूं; DivByZero अपवाद कभी वापस नहीं करेगा। क्यूं कर? क्योंकि यह संकलित नहीं होगा। आप इसे घोषित करने से पहले एक्स का उपयोग करने की कोशिश कर रहे हैं। नतीजा छोटा होने के बाद भी पूर्णांक विभाजन कम आम है। यह ध्यान देने योग्य है कि var z = 1/0.0; एक अपवाद फेंक नहीं है। नतीजा एक डबल है। पॉजिटिव इन्फिनिटी। –

1

मुझे लगता है कि रिशेर्पर आपको अपवादों पर संकेत देता है। लेकिन कारण यह है कि सी # चेक अपवादों का समर्थन नहीं करता है, अपवादों को निर्धारित करने का एक तरीका है। हो सकता है कि कोड विश्लेषण उपकरण जैसे NDepend इस का समर्थन करें।

+0

संकेत के लिए धन्यवाद..मैं उन्हें – Toad

1

सब कुछ अपवाद फेंक सकता है। एक विधि द्वारा फेंक दिया जा सकता अपवादों की एक सूची के लिए एमएसडीएन की जांच करें।

+1

हां देख सकता हूं ... उपयोग किए गए प्रत्येक फ़ंक्शन के लिए msdn की जांच करना कठिन है ... इसलिए मेरा प्रश्न; ^) – Toad

5

नहीं, स्वचालित रूप से ऐसा करने का कोई तरीका नहीं है और न ही किसी विधि द्वारा फेंक दिए गए सभी संभावित अपवादों की सूची प्राप्त करने का कोई अच्छा तरीका है। यहाँ कुछ कारणों की वजह से इस तरह के रूप में StackOverflowException

  1. पर विचार करें परोक्ष फेंका अपवाद किसी भी विधि से किसी भी समय फेंक दिया जा सकता है। आपको यह मानना ​​चाहिए कि सीएलआर में कोई भी तरीका इन प्रकार के अपवादों को फेंक सकता है
  2. प्रतिबिंब और/या प्रतिनिधि वास्तविक कोड को किसी विशेष विधि में बुलाए जा सकते हैं ताकि आप किसी विधि के सभी संभावित कोड पथों का निरीक्षण न कर सकें।
  3. इसके लिए आईएल बनाम मेटाडेटा का निरीक्षण करने की आवश्यकता होगी।
  4. नेट में अपवाद है कि स्पष्ट रूप से एक API
+0

1) ये आप लाइन पर संभाल नहीं करना चाहते हैं प्रति पंक्ति आधार ... इस प्रकार के अपवाद जो आप वैश्विक रूप से लॉग करते हैं और आपके प्रोग्राम को पुनरारंभ करते हैं (ऐप के आधार पर) 2) मैं बस मदद कर रहा हूं। लाइब्रेरी कॉल मदद फ़ाइलों में सूचीबद्ध अपवादों के साथ कॉल करता है 3) या सिर्फ एक सभी लाइब्रेरी कॉल के साथ टूल और उनके अपवाद 4) मैं केवल नेट लाइब्रेरी कॉल का जिक्र कर रहा हूं। यह पहले से ही महान होगा। – Toad

1

सभी गैर खाली तरीकों एक या किसी अन्य में अपवाद फेंक कर सकते हैं द्वारा फेंक दिया जाता है दस्तावेज़ के लिए कोई आवश्यकता नहीं है। आप अपवाद आप व्यक्तिगत रूप से जेनरेट किया है के बारे में चिंतित हैं, तो आप उन्हें IntelliSense से उसी तरह ढांचे तरीकों एक्सएमएल प्रलेखन के माध्यम से कर में, प्रदर्शित कर सकते हैं इस तरह:

/// <summary> 
/// I seem to have written a method to do a thing. 
/// </summary> 
/// <exception cref="System.Exception">An unfortunate failure.</exception> 
public void DoSomething() 
{ 
    /* ... */ 
} 
+0

इंटेलिसेंस अभी कोई अपवाद नहीं दिखाता है ... मैं नेट लाइब्रेरी कॉल के लिए इसे कैसे सक्षम करूं? – Toad

0

एक परावर्तक है Exception Finder में जोड़ने के जो दिखा देंगे क्या अपवाद एक विधि द्वारा फेंका जा सकता है। मैंने इसका उपयोग नहीं किया है, लेकिन नेट उपयोगकर्ता समूह की बैठक में इसका एक उदाहरण देखा है।

+0

टिप के लिए धन्यवाद ... मैं इसे देख सकता हूं – Toad

0

वहां एक उपकरण है जो ऐसा कर सकता है। आप परीक्षण डाउनलोड कर सकते हैं और देख सकते हैं कि आपको यह पसंद है या नहीं। मुझे सच में नहीं लगता कि यह आवश्यक होगा, लेकिन यदि आप किसी कंपनी के लिए काम कर रहे हैं और वे इसके लिए भुगतान करेंगे तो आप इसे देखना चाहेंगे। जैसा कि पहले उठाया गया है, वहां उठाए गए बहुत से संभावित अपवाद हैं।Excpetion Hunter

+0

टिप के लिए धन्यवाद ... मैं इसे – Toad

0

मुझे बाहरी पकड़ ब्लॉक के अंदर तोड़ने और वास्तविक बिंदु पर अपना रास्ता खोदने के लिए यह बहुत निराशाजनक लगता है जहां अपवाद खुशी है।

अधिकतर समय यदि कोई अपवाद फेंक दिया गया था और मुझे इसकी उम्मीद नहीं थी तो मुझे एक बग मिली और इसे सुलझाना आसान है अगर इसे कुछ करने-अपवाद अपवाद हैंडलिंग द्वारा अपवित्र नहीं किया गया था।

संपादित करें: चूंकि आपके उदाहरण वास्तव में एक अच्छा है क्योंकि मुझे अभी भी विश्वास नहीं है कि ऐसा टूल आपकी मदद करेगा। इतने सारे संभावित अपवाद होंगे कि सचमुच कोड की हर पंक्ति फेंक सकती है कि आपको "रोचक" खोजने के लिए कठिन समय होगा।

+0

से देखूंगा मैं अपवाद हैंडलर कुछ भी नहीं करना चाहता हूं। मैं बस पहले कोड के माध्यम से नज़र रखने में सक्षम होना चाहता हूं और कुछ टूल मुझे सबसे स्पष्ट भूल गए प्रयास पकड़ने वाले ब्लॉक – Toad

+0

बताते हैं क्या आपके पास एक वास्तविक उदाहरण है जहां यह सहायक है? – VVS

+0

मुझे मिला अंतिम अपवाद तब था जब http सर्वर ने '400 खराब अनुरोध' वापस कर दिया था। इसके परिणामस्वरूप इस लाइन में अपवाद हुआ: HttpWebResponse प्रतिक्रिया = (HttpWebResponse) अनुरोध।EndGetResponse (परिणाम); जब आप इसके बारे में सोचते हैं, तो यह स्पष्ट हो सकता है, लेकिन यह अच्छा होगा अगर कोई उपकरण मुझे इंगित करता है कि यह कार्य संभावित अपवादों को फेंक सकता है (स्टेक ओवरफ्लो/स्मृति के बाहर)। – Toad

2

जैसा कि अन्य ने कहा है, मुझे यकीन नहीं है कि आपको सी # में ऐसा करने का मूर्ख तरीका मिलेगा क्योंकि चेक अपवादों का समर्थन नहीं करता है।

एक तरफ के रूप में, इसने मुझे एंडर्स हेजल्सबर्ग के साथ एक साक्षात्कार की याद दिला दी जिसमें "The trouble with Checked Exceptions" पर चर्चा हुई। मैं चेक अपवादों को ज्वलंत करने की कोशिश नहीं कर रहा हूं, लेकिन यह सुझाव देता हूं कि आप सी # के अपवाद डिज़ाइन के पीछे एंडर के तर्क को पढ़ते हैं और अपवादों को संभालने के लिए सुझाए गए तरीके: केंद्रीकृत अपवाद हैंडलिंग।

+0

मैं इसे पढ़ूंगा! धन्यवाद! – Toad

+0

यह देखने के लिए मेरे मुख्य प्रश्न पर टिप्पणी देखें कि इस साक्षात्कार में एंडर्स वास्तव में मुझसे सहमत हैं कि 'भूल गए अपवाद हैंडलर' को इंगित करने के लिए एक उपकरण बहुत अच्छा होगा। मैं सुझाए गए टूल की सूची में जाऊंगा, और बाद में सबसे प्रासंगिक पोस्ट करूंगा। – Toad

1

कोई भी कोड संभावित रूप से अपवाद का कारण बन सकता है, यह आपकी कोशिश करने और इसकी उम्मीद करने का काम है!

ऐसे कई तृतीय पक्ष टूल हैं जो कुछ सामान्य त्रुटियों को खोजने में सहायता कर सकते हैं जैसे fxcop और उपकरण जैसे रिफैक्टर सुझाव दे सकते हैं।

इस समय कुछ काम किया गया है जो संभावित अपवादों को ढूंढने में आपकी सहायता कर सकता है। PEX में एक नज़र डालें जो आपके कार्यों के लिए परीक्षण उत्पन्न करने में मदद कर सकता है: research.microsoft.com/en-us/projects/Pex/ (लिंक पोस्टिंग के समय नीचे प्रतीत होता है)

एक और रोमांचक क्षेत्र कोड अनुबंध है (.NET 4/spec के रूप में उपलब्ध #) में आ रहा है। कोड अनुबंध आपको ऐसे बयान लिखने की अनुमति देते हैं जो शर्तों को निर्दिष्ट करते हैं जिन्हें पूरा किया जाना चाहिए। ये आपके फ़ंक्शन के पहले और बाद में हो सकते हैं और आप इनवेरिएंट भी घोषित कर सकते हैं। एक शर्त मूल्य के रूप में सरल कुछ हो सकती है! = शून्य। इन शर्तों को तब संकलित और रनटाइम पर विश्लेषण किया जाता है ताकि कोई कोड पथ उनका उल्लंघन न हो।

+0

मैं इसे अनुमानित करना चाहता हूं ... लेकिन यह अच्छा होगा अगर विजुअल स्टूडियो मुझे थोड़ा सा मदद करेगा। प्रत्येक .NET कॉल के लिए एमएसडीएन खोलना कम से कम – Toad

0

कुछ लोगों द्वारा उल्लिखित अपवाद हंटर इस के साथ मदद करने के लिए एक अच्छा उपकरण है। मुझे नहीं पता कि इसमें <exception> एक्सएमएल-डॉक टिप्पणी के साथ टाई-इन है ताकि आप कोड द्वारा फेंकने वाले अपवादों के दस्तावेज़ीकरण को लागू कर सकें।

1

जैसा कि अन्य ने कहा है, आपको यह मानना ​​चाहिए कि कोड की प्रत्येक पंक्ति अपवाद फेंक सकती है, जब तक कि आप साबित न करें कि यह नहीं हो सकता है। बेहतर सवाल यह है कि, "आप इसके बारे में क्या करने की योजना बना रहे हैं?"

सामान्य रूप से, आपको किसी भी अपवाद को पकड़ना नहीं चाहिए।

बेशक, बाकी सब कुछ उस नियम का अपवाद है। इसे लॉग इन करने के लिए अपवाद को पकड़ना समझ में आता है (यदि आपका पर्यावरण आपके लिए ऐसा नहीं करता है, जैसा कि एएसपी.नेट करता है)। यह समझ में आता है क्रम में एक और अपवाद है कि संदर्भ के बारे में और अधिक विस्तार प्रदान करता है के साथ बदलने के लिए एक अपवाद को पकड़ने के लिए:

public int GetConfiguredInteger(string name) { 
    string s = null; 
    try { 
     s = GetStringFromConfigFile(name); 
    } 
    catch (IOException ex) { 
     throw new Exception(String.Format(
      "Error in configuration file foo.config when processing {0}", name), 
      ex); 
    } 
    return int.Parse(s); 
} 

फोन करने वाले को पता ही न हो सकता है कि IOException एक कॉन्फ़िग फ़ाइल के कारण हुई थी अगर तुम hadn ' टी ने उन्हें बताया। ध्यान दें कि मैंने फ़ाइल I/O से संबंधित सभी अपवादों को कैसे नजरअंदाज किया। विशेष रूप से, ध्यान दें कि int.Parse कोशिश/पकड़ ब्लॉक के अंदर भी नहीं है।

ऐसे कुछ अपवाद हैं, लेकिन अपवादों को पकड़ने का मूल विचार यह है: ऐसा तब तक न करें जब तक आप नहीं करते।

+0

कहने के लिए कठिन है, मैं अपवादों को संभालना चाहता हूं क्योंकि उन्हें संभालने का मतलब है कि मेरा ऐप असफल रहा है। वेबरेक्वेस्ट करते समय इसका उपयोग करना एक अच्छा उदाहरण है। जब रिमोट सर्वर 'खराब अनुरोध' एचटीएमएल त्रुटि देता है, तो यह अपवाद में मेरे पास वापस आ जाता है। यदि कोई इसकी अपेक्षा नहीं करता है, तो आपका प्रोग्राम मर जाता है। इन मामलों के लिए, इन संभावित अपवादों को इंगित करने के लिए एक उपकरण (या इंटेलिसेंस रंग) बहुत अच्छा होगा। – Toad

+0

नहीं। जब अपवाद होता है, तो आपका एप्लिकेशन पहले ही "विफल" हो चुका है। यदि आपका एप्लिकेशन सफल वेबरेक्वेस्ट पर निर्भर करता है, तो एक असफल व्यक्ति का मतलब है कि आपका एप्लिकेशन विफल हो गया है। इस मामले में, यदि आपका ऐप WinForms है, तो आप ईवेंट हैंडलर में अपवाद को पकड़ना चाहते हैं जिसे अंततः वेब अनुरोध कहा जाता है, फिर अपवाद लॉग करें और शायद एक संदेशबॉक्स प्रदर्शित करें। लेकिन एप्लिकेशन पहले से ही असफल रहा है, और इसके बारे में आप कुछ भी नहीं कर सकते हैं। विफल == "उपयोगकर्ता द्वारा क्या किया गया नहीं कर सकता"। –

+0

ऐप को असफल होने की आवश्यकता नहीं है। यह पूरी तरह से आवेदन पर निर्भर करता है। मान लीजिए कि मेरे पास रिमोट लॉगिंग है, और webrequest कुछ लॉगिंग का मेरा तरीका है। यदि यह विफल हो जाता है, तो मेरे पूरे कार्यक्रम को बंद/क्रैश करने की आवश्यकता नहीं होती है और न ही उसे उपयोगकर्ता को कुछ रिपोर्ट करना पड़ता है। हालांकि, मैं पहले से यह जानना चाहता हूं कि यह विधि अपवाद फेंक सकती है, इसलिए मैं इसे गहन रूप से संभाल सकता हूं (और खुद को तय कर सकता हूं कि ऐप को मरने या कुछ और करने की आवश्यकता है, या बस इसे अनदेखा करें और जारी रखें)। – Toad

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