2012-08-15 17 views
9

के किसी भी उपयोग को आसान बनाने/पकड़ने के लिए मैंने अपने प्रश्न का उत्तर खोजा है लेकिन एक खोजने में सक्षम नहीं है। क्षमा करें अगर जवाब वहां है और मैं नकल कर रहा हूं!अपवाद

मैं ट्राई/कैच कोड देखकर जैसे .....

try 
{ 
    //Do whatever 
} 
catch (Exception ex) 
{ 
    MessageBox.Show("Oops, something went wrong!"); 
} 

कौन सा एक चेतावनी पूर्व में परिणाम होगा इस्तेमाल कभी नहीं किया है रखने के लिए।

तो मेरा सवाल है ... हालांकि पूर्व में कभी भी उपयोग नहीं किया जाता है, घोषणा में कोई फायदा होता है? मुझे बताया गया था कि शायद यह स्टैक ट्रेस में विस्तार जोड़ता है? कभी-कभी मुझे पकड़ (अपवाद) दिखाई देता है जो चेतावनी को रोकता है लेकिन इससे कोई लाभ क्या होता है, अगर कोई है? यदि मैं यह लिख सकते हैं और किसी भी तरह से मैं पूर्व की घोषणा नहीं होगा में अपवाद का उपयोग नहीं करने के लिए था ...

try 
{ 
    //Do whatever 
} 
catch 
{ 
    MessageBox.Show("Oops, something went wrong!"); 
} 

नहीं एक बड़ी समस्या है, लेकिन यह निश्चित रूप से जानना अच्छा होगा!

धन्यवाद

फ्रेड

+0

आप शायद भले ही आप उपयोगकर्ता के लिए यह कभी नहीं दिखाने के लिए, ताकि आप इसे बाद डीबग कर सकते हैं एक लॉग करने के लिए वास्तविक अपवाद लिखना चाहते हैं। – Rup

+0

हां, यदि आप गलत (आपके ऊपर) में रुचि नहीं रखते हैं तो आप अपवाद – bizl

+0

घोषित नहीं कर सकते हैं क्योंकि आपके पास कई 'पकड़' हो सकते हैं, इसलिए आप 'कैच (BadFormatException) {/ * खराब प्रारूप लिख सकते हैं यहां * /} पकड़ें (अपवाद पूर्व) {/ * अज्ञात त्रुटि यहां * /} '। मुझे लगता है कि 'पकड़ (अपवाद) ' – Default

उत्तर

10

आप निम्न पैटर्न का उपयोग कर सकते हैं अभी भी विशिष्ट अपवाद प्रकार की घोषणा एक चर के बिना हैंडलिंग संरचित अपवाद सुनिश्चित करने के लिए (SEH) अभी भी हो रहा है:

try 
{ 
    //Do whatever 
} 
catch (IOException) 
{ 
    MessageBox.Show("Oops, something went wrong in the IO!"); 
} 
catch (Exception) 
{ 
    MessageBox.Show("Oops, something went wrong!"); 
} 

यह एक ऐसा अभ्यास नहीं है जिसका मैं सामान्य रूप से उपयोग करता हूं, क्योंकि अगर मैं इसे पुनर्स्थापित नहीं करता तो शायद अपवाद विवरण लॉग इन करता हूं।

+0

मुझे नहीं पता था कि जब तक मैं इसे पार नहीं कर लेता, तब तक इसे एक चर (जैसे "IOException ex") को असाइन किए बिना अपवाद पकड़ सकता है। धन्यवाद! –

1

आप उपयोग कर सकते हैं कि बाद में उपयोग, प्रवेश सहित, संदेश आदि के लिए ex चर

try 
{ 
    //Do whatever 
} 
catch (Exception ex) 
{ 
    MessageBox.Show(ex.Message); 

} 

मान लीजिए कि आपके अपवाद प्रवेश करना चाहते हैं, ताकि बाद में डेवलपर लॉग पर एक नज़र डालें और निर्धारित करें कि क्या गलत हुआ। उस स्थिति में ex लॉगिंग के लिए आवश्यक सभी आवश्यक विवरण रखेंगे। जैसे StackTrace, संदेश, InnerException यदि कोई आदि

अपने प्रश्नों के लिए:

हालांकि पूर्व इस्तेमाल कभी नहीं किया गया है कि घोषणा में किसी भी लाभ है?

यदि आप उपयोग नहीं करेंगे, तो इसे घोषित करने में कोई लाभ नहीं है।

मुझे बताया गया कि शायद यह स्टैक ट्रेस में विस्तार जोड़ता है?

मुझे यकीन नहीं है, लेकिन मुझे लगता है कि यह नहीं है। यदि आप एक को परिभाषित करते हैं, तो इसमें अपवाद का स्टैक ट्रेस होगा, लेकिन इसमें कुछ भी नहीं जोड़ा जाएगा।

कभी-कभी मुझे पकड़ (अपवाद) दिखाई देता है जो चेतावनी को रोकता है लेकिन लाभ क्या होता है, यदि कोई है?

आप अपवाद throw कीवर्ड का उपयोग फेंक फिर से करना चाहते हैं, तो आप catch(Exception)

+0

क्षमा करें शायद मुझे कहना चाहिए था। मैं समझता हूं कि आपके पास घोषणा क्यों होगी और आप किस प्रकार के अपवादों को पकड़ सकते हैं। मुझे नहीं पता कि अगर आप इसका उपयोग नहीं कर रहे हैं तो घोषणा के लिए कोई फायदा है। मुझे बेकार लगता है लेकिन क्या मुझे कुछ याद आ रही है? – Fred

0

नहीं, कोई मतलब नहीं है का उपयोग कर सकते यह घोषित जब तक आप वास्तव में इसका इस्तेमाल में।

3

अपवादों को दबाना आमतौर पर खराब रूप है ... उन्हें ढेर की यात्रा करने दें।

"विस्तार जोड़ता है" के संबंध में, स्टैक ट्रेस को संरक्षित करने के लिए throw का उपयोग करके अपवाद को दोबारा हटाएं अन्यथा आप विवरण खो देंगे। दोबारा, विकल्प इसे पकड़ने के लिए बिल्कुल नहीं है।यदि आपके पास अपवाद (पुनर्प्राप्ति, अनचाहे इत्यादि) के लिए कोई उपयोग नहीं है, संभावना है कि इसे पकड़ने का कोई अच्छा कारण नहीं है।

देखें: What is the proper way to re-throw an exception in C#?

यह भी देखें: "Back to Basics - Exceptions"

3

यह आपकी दो पोस्ट कोड ब्लॉक में एक फर्क है कि ध्यान देना महत्वपूर्ण है। catch (Exception ex) केवल सीएलआर-परिभाषित अपवादों को पकड़ेंगे (वे Exception से प्राप्त होते हैं)। catch अकेले कुछ भी पकड़ लेगा - जिसमें अप्रबंधित अपवाद भी शामिल हैं जो सीएलआर ने खुद को पकड़ा या लपेटा नहीं है।

आप कोड के व्यवहार को बदलने के बिना अपने संकलक चेतावनी से बचना चाहते हैं, या यदि आप जबकि अभी भी एक विशिष्ट अपवाद प्रकार पकड़ने चेतावनी से बचना चाहते हैं, तो आप इस के बजाय का उपयोग कर सकते हैं:

catch (Exception) 
{ 
} 

यहां लाभ यह है कि आप विशिष्ट हो सकते हैं: catch (SqlException), उदाहरण के लिए। यदि आप चर का उपयोग नहीं कर रहे हैं तो चेतावनी दें, लेकिन टाइप-विशिष्ट व्यवहार अभी भी उपयोगी है।

भले ही अपवाद की घोषणा सूचना (स्टैक ट्रेस या अन्यथा) में कुछ भी नहीं जोड़ती है, जब तक कि आप अपवाद को स्पष्ट रूप से लपेटें और/या-फिर से हटा दें। (संयोग से, throw ex उपयोग नहीं करते rethrow है, क्योंकि इस जानकारी खो करता है:। बस throw का उपयोग करें)

1

तुम सच में अपवाद के साथ कुछ भी करने को नहीं करना चाहते हैं, तो आप भी तो बचने के लिए की तरह कर सकते हैं संकलक चेतावनी:

catch (Exception) 
{ 
    // Stick our head in the sand 
} 

(or just catch)

1

यह सब डेवलपर और एक बाद की अवधि में उचित प्रवेश/डिबगिंग को लागू करने की क्षमता के बारे में है ...

इस:

catch (Exception ex) 
{ 
    MessageBox.Show("Oops, something went wrong!"); 
} 

आसानी से

करने के लिए परिवर्तित किया जा सकता है
catch (Exception ex) 
{ 
    Log.Append(ex); 
    MessageBox.Show("Oops, something went wrong. Please check the Log file."); 
} 

कभी-कभी यह पर डिबगिंग के लिए होता है जब आप लाइन से लाइन चलाते हैं और आपपर ब्रेक पॉइंट प्राप्त कर सकते हैं 210 लाइन और ex चर पढ़ें।

यह उपयोगिता है, लेकिन, संकलित समय में, अगर आप इसका इस्तेमाल नहीं करते हैं, आप एक चेतावनी कि चर ex घोषित कर दिया और नहीं प्रयोग किया जाता है मिल जाएगा, तो, आप उन सभी को ट्रैक कर सकते हैं और सूख लॉग है इसे, या इसे हटा दें।

फिर, यह प्रोग्रामर पसंद के बारे में है, और ... एक अप्रयुक्त चर एक अंतिम कार्यक्रम पर समस्याग्रस्त नहीं है।

0

Exception ex जो रनटाइम अपवाद ऑब्जेक्ट का संदर्भ होगा, कई फायदे दे सकते हैं। आप स्वयं डेवलपर के रूप में इसे टेक्स्ट फ़ाइल में लॉग कर सकते हैं या खुद को एक रिपोर्ट भेज सकते हैं।

MSDN के दस्तावेज के रूप में:

आप अपवाद वर्तमान में एक पैरामीटर कम पकड़ खंड द्वारा नियंत्रित फिर से फेंक करना चाहते हैं, तर्क के बिना फेंक बयान का उपयोग करें।

http://msdn.microsoft.com/en-us/library/0yd65esw%28v=vs.80%29.aspx

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