2011-11-04 13 views
39

बिना उपयोग करना पकड़ क्या बीच का अंतर है:तर्क

catch 
{ 
    MessageBox.Show("Error."); 
} 

और:

catch (Exception ex) 
{ 
    MessageBox.Show("Error."); 
    //we never use ex, so is it better to use catch without arguments? 
} 
+0

इसे पढ़ें: http://msdn.microsoft.com/en-us/library/0yd65esw(VS.80).aspx – JonH

+0

दूसरे मामले में, 'कैच (अपवाद)' का उपयोग करें यदि आप उस प्रकार को पकड़ना चाहते हैं या व्युत्पन्न प्रकार के अपवाद, लेकिन विवरण जानना नहीं चाहते हैं। अन्यथा आपको एक चेतावनी मिलेगी और जब किसी की आवश्यकता नहीं होती है तो एक चर घोषित करें –

उत्तर

52

.NET 2 के रूप में, यदि आप कॉन्फ़िगरेशन को ट्वीक नहीं करते हैं? कुछ भी तो नहीं।

तो इससे पहले, या कुछ config ट्वीक मैं ठीक याद नहीं कर सकते के साथ, वहाँ एक अपवाद की संभावना अप्रबंधित कोड जो एक Exception संगत वस्तु में बदल नहीं था से फेंका जा रहा था।

नोट वहाँ जहाँ आप प्रकार है, लेकिन कोई चर निर्दिष्ट करते हैं, के बीच में एक और विकल्प है कि: बिना भी प्रवेश यह

catch (Exception) 
{ 
    ... 
} 

व्यक्तिगत तौर पर मैं एक अपवाद को पकड़ने की बहुत सावधान रहना होगा। यदि आप एक हड्डीदार एपीआई बुला रहे हैं, तो यह आवश्यक हो सकता है, लेकिन यह आमतौर पर सबसे अच्छा बचा जाता है।

+1

"अप्रबंधित कोड से एक अपवाद को फेंकने की संभावना थी जो प्राप्त नहीं हुआ ..." तो 2.0 से आगे यह अपवाद संगत में परिवर्तित हो जाता है? यानी अब प्रबंधित या अप्रबंधित द्वारा फेंक दिया गया कुछ भी पकड़ (अपवाद ई) {} द्वारा पकड़ा जाएगा। बीटीडब्ल्यू, मैंने आउटलुक इंटरऑप लाइब्रेरी के साथ प्रयोग करने का प्रयास किया लेकिन यह सुनिश्चित नहीं किया कि एक वैध अप्रबंधित कोड त्रुटि कैसे प्राप्त करें। – devanalyst

+1

@devanalyst: हाँ, मुझे विश्वास है * सबकुछ अब 'अपवाद' में परिवर्तित हो गया है। –

+0

@ जोन्स स्केट: लेकिन 'पकड़', 'पकड़ (अपवाद)' और 'पकड़ (अपवाद पूर्व) 'के बीच क्या अंतर है? पहला सबकुछ पकड़ने से कुछ भी नहीं करता, दूसरा दूसरा प्रकार, और तीसरा विवरण भी? अपवाद के अलावा आपको क्या पकड़ना चाहिए? – testing

3

अपने दूसरे उदाहरण में आप अपवाद डेटा संदर्भित कर सकते हैं स्टैक ट्रेस, स्रोत, आदि यह भी तरह, एक सामान्य संदेश देता है जो कभी-कभी सहायक होता है। यह आपको बताता है कि आपको अपवाद का सामना करना पड़ा जो डीबगिंग के दौरान महत्वपूर्ण है।

+1

मुझे लगता है कि आप इस बिंदु को चूक गए हैं, पहला व्यक्ति सभी अपवादों को पकड़ता है, दूसरा कैच करता है .NET अपवाद –

+0

वास्तव में वे सभी पूछते थे कि अंतर क्या है दो पकड़ उदाहरण और यह अंतर है। या तो आप अपवाद का संदर्भ देते हैं या आप नहीं करते हैं। और इसलिए आप जानते हैं, दोनों उदाहरण सभी नेट अपवादों को पकड़ते हैं। आपके द्वारा पकड़ा गया कोई भी अपवाद "नेट अपवाद" होगा क्योंकि यह सी # है। यह भी ध्यान रखना महत्वपूर्ण है कि सभी अपवादों में उनके उत्तराधिकारी पेड़ में अपवाद वर्ग होता है क्योंकि एक अपवाद वर्ग को किसी अन्य वर्ग से उत्तराधिकारी द्वारा प्रत्यक्ष या परोक्ष रूप से प्राप्त करना होगा जिसने अपवाद वर्ग को विरासत में मिला है। – jlafay

+0

आप गलत हैं, कुछ अपवाद अपवाद से प्राप्त नहीं होते हैं। उपयोगकर्ता कोड, या सी # कोड द्वारा बनाए गए लोग, लेकिन कुछ अन्य –

6

आम तौर पर आपको पहले विशिष्ट त्रुटियों को पकड़ना चाहिए।

लेकिन आप की तरह मैं उपयोग कहेंगे दूसरे मामले करना यदि आप एक सामान्य Exception को पकड़ने के लिए जाना:

catch (Exception ex) 
{ 
    MessageBox.Show("Error."); 
    //we never use ex, so is it better to use catch without arguments? 
} 

इस debbuging साथ मदद कर सकता है के बाद से चर स्टैक ट्रेस, अपवाद संदेश है .. ।आदि। जो आप त्रुटि या कुछ लॉगिंग के लिए उपयोग कर सकते हैं जो इसे रोकने में आपकी सहायता करेगा।

, इस दृष्टिकोण का उपयोग हालांकि बहुत सावधान रहो

:

MessageBox.Show("Error."); 

नहीं (एक लॉग फ़ाइल की तरह) कहीं अपने त्रुटियों का ट्रैक रखने के एक बहुत बड़ा गड़बड़ हो सकता है।

+0

अपवाद डेटा वैसे भी पहुंच योग्य है। यदि आप चर के बिना अपवाद में कदम रखते हैं, तो एक प्रतीक दिखाई देगा जो आपको अपवाद डेटा दिखाएगा। – GeirGrusom

+0

@GeirGrusom - हाँ, लेकिन आप फ़ाइल में लॉगिंग के लिए उस जानकारी का उपयोग नहीं कर सकते हैं या कुछ हम कर सकते हैं? – TheBoyan

+0

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

6

मुझे लगता है कि वे वही हैं। लेकिन दूसरे मामले में एक कंपाइलर चेतावनी उठाई गई क्योंकि आप एक अपवाद घोषित करते हैं जिसका आपने उपयोग नहीं किया था। मैं पहले की तरह हूं क्योंकि आप स्पष्ट रूप से कहते हैं कि आप अपवाद का उपयोग नहीं करते हैं। एक तीसरा एक

catch (Exception) 
{ 
    //do something 
} 

यदि आप अपवाद के प्रकार को निर्दिष्ट करना चाहते हैं लेकिन अपवाद के बारे में परवाह नहीं है।

+0

तो क्या इसका मतलब यह है कि यदि कोई अपवाद फेंक दिया जाता है, तो यह अभी भी पकड़ ब्लॉक के अंदर जाता है, भले ही हम अपवाद के साथ कुछ भी नहीं करते? –

0

कुछ अपवाद catch(Exception) कैच नहीं किया जा सकता है।

लिनक्स पर मोनो में बहिष्कार के नीचे, पैरामीटर के बिना पकड़ना चाहिए।

अन्यथा रनटाइम catch(Exception) स्टेटमेंट को अनदेखा कर देगा।

System.Reflection.ReflectionTypeLoadException: The classes in the module cannot be loaded. 

आप ऐसा समस्या आती है, लोग इन संदर्भ त्रुटि कारण जानने के लिए वार्स, catch बयान के पैरामीटर को निकालने का प्रयास करें।

पीएस मुझे नहीं पता कि विंडोज़ पर कैसे, विंडोज़ में चलने वाला प्रोग्राम सामान्य है।

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