क्योंकि भाषा विनिर्देश System.Exception
वहाँ प्रकार की अभिव्यक्ति की उम्मीद करता है (इसलिए, null
उस संदर्भ में एक मान्य है) और इस अभिव्यक्ति को गैर-अशक्त होने के लिए प्रतिबंधित नहीं करता है। सामान्य तौर पर, ऐसा कोई तरीका नहीं है जिससे यह पता लगाया जा सके कि उस अभिव्यक्ति का मूल्य है null
या नहीं। यह रुकने की समस्या को हल करना होगा। रनटाइम को null
वैसे भी मामले से निपटना होगा । देख:
Exception ex = null;
if (conditionThatDependsOnSomeInput)
ex = new Exception();
throw ex;
वे निश्चित रूप से, null
शाब्दिक को फेंकने के विशिष्ट मामले को अमान्य बना सकते हैं, लेकिन इससे बहुत मदद नहीं मिलेगी, इसलिए स्पेसिफिकेशन को कम क्यों करें और थोड़े से लाभ के लिए निरंतरता को कम करें?
अस्वीकरण (इससे पहले कि मैं एरिक लिपर्ट द्वारा थप्पड़ मारा जाता हूं): इस डिजाइन निर्णय के पीछे तर्क के बारे में मेरी अपनी अटकलें हैं। बेशक, मैं डिजाइन मीटिंग में नहीं गया हूं;)
आपके दूसरे प्रश्न का उत्तर, कि क्या कैच क्लॉज़ के भीतर एक अभिव्यक्ति चर पकड़ा जा सकता है, कभी भी अशक्त हो सकता है: जबकि C # विनिर्देश इस बारे में चुप है कि क्या अन्य भाषाएं null
प्रचारित करने के लिए अपवाद का कारण बन सकती हैं , यह इस तरह परिभाषित करता है कि अपवाद प्रचारित हैं:
अपवाद के लिए उपयुक्त हैंडलर का पता लगाने के लिए कैच क्लॉज़, यदि कोई हो, उपस्थिति के क्रम में जांच की जाती है। पहला कैच क्लॉज जो अपवाद प्रकार को निर्दिष्ट करता है या एक आधार प्रकार के अपवाद प्रकार को मैच माना जाता है। एक सामान्य कैच क्लॉज को किसी भी अपवाद प्रकार के लिए एक मैच माना जाता है। [...]
के लिए null
, बोल्ड स्टेटमेंट गलत है। इसलिए, जबकि विशुद्ध रूप से सी # कल्पना कहती है, हम यह नहीं कह सकते कि अंतर्निहित रनटाइम कभी भी अशक्त नहीं होगा, हम यह सुनिश्चित कर सकते हैं कि अगर ऐसा है, तो भी यह केवल सामान्य catch {}
क्लॉज द्वारा नियंत्रित किया जाएगा ।
सीएलआई पर C # कार्यान्वयन के लिए, हम ECMA 335 विनिर्देश का उल्लेख कर सकते हैं। वह दस्तावेज़ सभी अपवादों को परिभाषित करता है कि सीएलआई आंतरिक रूप से फेंकता है (जिनमें से कोई भी नहीं null
) और उल्लेख करता है कि उपयोगकर्ता द्वारा परिभाषित अपवाद ऑब्जेक्ट्स को throw
निर्देश द्वारा फेंक दिया गया है । उस निर्देश का विवरण वस्तुतः C # throw
कथन के समान है (सिवाय इसके कि वह वस्तु के प्रकार को प्रतिबंधित न करे System.Exception
):
विवरण:
throw
अनुदेश अपवाद वस्तु (प्रकार फेंकता O
स्टैक पर) और ढेर खाली। अपवाद तंत्र के विवरण के लिए, विभाजन I देखें।
[नोट: जबकि सीएलआई किसी भी वस्तु को फेंकने की अनुमति देता है, सीएलएस एक विशिष्ट अपवाद वर्ग का वर्णन करता है जिसका उपयोग भाषा अंतर के लिए किया जाएगा। नोट नोट]
अपवाद:
System.NullReferenceException
अगर फेंक दिया जाता है obj
है null
।
शुद्धता:
सही CIL यह सुनिश्चित करता है कि ऑब्जेक्ट हमेशा या तो null
ऑब्जेक्ट रेफ़रेंस (यानी, प्रकार का O
) हो।
मेरा मानना है कि ये निष्कर्ष निकालने के लिए पर्याप्त हैं अपवाद कभी नहीं पकड़े गए हैं null
।