2012-09-27 14 views
16

तो जिज्ञासा से बाहर मैं देखना चाहता था कि अपवाद वर्ग के बारे में क्या विशेष था, जिसने इसे मानक Throw के साथ उपयोग करने की अनुमति दी, जबकि मानक वर्ग नहीं है।सिस्टम से निकाला गया या पकड़ा जाने वाला एक प्रकार क्यों होना चाहिए। अपवाद

सभी मैंने पाया अपवाद वर्ग कार्यान्वित कि निम्नलिखित

public class Exception : System.Object, System.Runtime.Serialization.ISerializable, System.Runtime.InteropServices._Exception 
{ 
} 

तो मैं उन्हीं इंटरफेस को लागू करने और उस System.Exception से कोई लाभ नहीं हुआ निकाले जाते हैं नहीं था मेरे स्वयं के कस्टम अपवाद फेंक करने के लिए प्रयास करने की कोशिश की है। मैं बस की सलाह दी गई है कि

प्रकार पकड़े जाने या फेंक दिया System.Exception

तो वहाँ इस के लिए कोई विशिष्ट कारण है से प्राप्त किया जाना चाहिए? मुझे लगता है कि प्रबंधित भाषाओं में कुछ विकल्प मनमाने ढंग से प्रतीत होते हैं।

+0

मुझे लगता है कि यह कैसे काम करता है यह पता लगाने के लिए, कक्षा 'अपवाद' के बजाए 'फेंक' के कार्यान्वयन को देखने के लिए और अधिक समझदारी होगी। – Guillaume

+0

काफी उचित लेकिन ईमानदारी से, मुझे कोई सुराग नहीं होगा कि यह भी करना शुरू करें ... –

उत्तर

18

मुझे लगता है कि आपका आधार गलत है। यह संभव है कि एक ऑब्जेक्ट फेंक दिया गया है जो System.Exception से नहीं लिया गया है। आप इसे सी # में फेंक नहीं सकते हैं या ऑब्जेक्ट को कैच क्लॉज में देख सकते हैं। सी # कल्पना (v4.0) की धारा 8.10 से:

कुछ प्रोग्रामिंग भाषाओं अपवाद नहीं हैं का समर्थन कर सकते , एक वस्तु System.Exception से व्युत्पन्न के रूप में प्रदर्शनीय हालांकि ऐसे अपवादों सी # कोड से कभी नहीं उत्पन्न किया जा सकता । इस तरह के अपवादों को पकड़ने के लिए एक सामान्य पकड़ खंड का उपयोग किया जा सकता है। इस प्रकार, एक सामान्य पकड़ खंड उस से अलग है जो सिस्टम निर्दिष्ट करता है। अपवाद, जिसमें पूर्व अन्य भाषाओं से अपवाद भी प्राप्त कर सकता है।

एक सामान्य पकड़ का एक उदाहरण:

try 
{ 
} 
catch (Exception) { } // 'specific' catch 
catch { } // 'general' catch 

विशेष रूप से, यह महत्वपूर्ण है जब अप्रबंधित कोड बुला है।

कुछ प्रकार हमेशा हर भाषा में विशेष उपचार प्राप्त करते प्रतीत होते हैं। अधिकतर क्योंकि वे सिस्टम के लिए बहुत मौलिक हैं। System.Exception, System.ValueType, System.Delegate सी # में सभी विशेष प्रकार हैं जो भाषा कीवर्ड और सीएलआर से कड़े बाध्य हैं, इसलिए यह आश्चर्य की बात नहीं है कि आप अपनी भूमिकाओं को लेने वाले वर्गों को लागू नहीं कर सकते हैं।

+1

वाह, मुझे यह नहीं पता था, मेरी समझ को विस्तारित करने के लिए बहुत बहुत धन्यवाद ... –

+0

+1 मैंने सी # spec का थोड़ा सा पढ़ा है, लेकिन मैंने कभी नहीं देखा (या कम से कम पूरी तरह से महत्व को समझ नहीं लिया) वह मार्ग मेरा उत्थान आपको 1 999 के प्रतिनिधि को रखता है, मैं देखूंगा कि मुझे 2000 से अधिक वोट देने के लिए कुछ और मिल सकता है या नहीं। – phoog

4

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

9

Design Guidelines for Exceptions

अपवाद त्रुटियों की रिपोर्टिंग के लिए मानक तंत्र हैं। अनुप्रयोगों और पुस्तकालयों को त्रुटियों को संवाद करने के लिए रिटर्न कोड का उपयोग नहीं करना चाहिए। अपवाद के उपयोग के लिए एक सुसंगत ढांचे डिजाइन में जोड़ता है और इस तरह के निर्माताओं के रूप में सदस्यों, से त्रुटि रिपोर्टिंग की अनुमति देता है, कि एक वापसी प्रकार

throw (C# Reference)

फेंका अपवाद एक वस्तु जिसका वर्ग है नहीं हो सकता सिस्टम से लिया गया है। अपवाद, जैसा कि निम्न उदाहरण में दिखाया गया है।

class MyException : System.Exception {} 
// ... 
throw new MyException(); 

Exceptions Overview

.नेट फ्रेमवर्क में, एक अपवाद है, एक उद्देश्य यह है कि अपवाद कक्षा से विरासत

तो, अपने अपवाद System.Exception से निकाले जाते हैं चाहिए है, लेकिन यह आप पर निर्भर करता है, आप इसे कैसे व्यवस्थित करते हैं।

4

यह सीएलएस के डिजाइनरों की मनमानी पसंद है। संभवतः उन्होंने स्थिरता के कारणों के लिए यह विकल्प बनाया। सी # सीएलएस का पालन करता है; इस कारण से संकलक द्वारा आवश्यकता लागू की जाती है, अपवाद प्रकार के कार्यान्वयन से संबंधित किसी भी तकनीकी कारण के लिए नहीं।

सीएलआई वास्तव में किसी ऑब्जेक्ट को फेंक सकता है। http://jilc.sourceforge.net/ecma_p3_cil.shtml#_Toc524462405 देखें।

3

एक कारण यह है कि प्रत्येक अपवाद को सार्वभौमिक आधार वर्ग की आवश्यकता होती है ताकि आप एक ही कैच ब्लॉक में हर प्रकार के अपवाद को पकड़ सकें।

मैं इस हों:

try 
{ 
    ... 
} 
catch(Exception ex) 
{ 
    // Handle somehow 
} 

कि सभी अपवाद पकड़ेगा और वह मुझे प्रदर्शित करने के लिए क्या यह (ex.Message का उपयोग करके) है की अनुमति देगा।

यदि आप कुछ भी फेंक सकते हैं, तो आपके पास कैच होगा जो सबकुछ पकड़ लेगा और फिर भी आपको उस ऑब्जेक्ट तक पहुंचाएगा?

आप इस है, जो पूरी तरह से सब कुछ पकड़ेगा हो सकता है:

try 
{ 
    ... 
} 
catch 
{ 
    // Handle somehow 
} 

लेकिन तुम बात यह है कि फेंक दिया गया था 'खो' दिया है।

+0

अच्छी तरह पकड़ने के बारे में क्या (ऑब्जेक्ट ओ)? सी ++ के साथ बातचीत करते समय शायद यह पर्याप्त नहीं होगा, लेकिन यह किसी और चीज को फेंकने से बचने का कारण नहीं होना चाहिए। –

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