सभी चीजों के प्यार के लिए पवित्र, आप पूर्वनिर्धारित .NET अपवाद वर्गों के भीतर अलग-अलग "अपवाद स्वाद" के बीच अंतर कैसे करते हैं?.NET अपवाद प्रकारों के बीच अंतर
उदाहरण के लिए, कोड का एक टुकड़ा निम्नलिखित परिस्थितियों में एक XmlException
फेंक सकता है:
- दस्तावेज़ के मूल तत्व शून्य है
- अमान्य वर्ण दस्तावेज़
- में हैं दस्तावेज़ भी है लंबे
इन सभी के XmlException
वस्तुओं और आंतरिक के सभी के रूप में फेंक दिया जाता है क्षेत्रों (जैसे कि "मेरे बारे में इस अपवाद में और अधिक बता" Exception.HResult
, Exception.Data
, आदि) आमतौर पर खाली या शून्य होते हैं।
यह केवल एक चीज है कि आप इन अपवाद प्रकार के बीच भेद करने के लिए अनुमति देता है के रूप में Exception.Message
छोड़ देता है, और अगर तुम सच में उस पर निर्भर नहीं कर सकते, क्योंकि आप सही अनुमान लगाया, Exception.Message
स्ट्रिंग glocabilized है, और जब संस्कृति परिवर्तन बदल सकते हैं। कम से कम यह documentation पर मेरा पढ़ा है।
Exception.HResult
और Exception.Data
को .NET पुस्तकालयों में व्यापक रूप से अनदेखा किया जाता है। वे दुनिया के .NET त्रुटि-हैंडलिंग कोड के लाल सिर वाले stepchildren हैं। और यह भी मानते हुए कि वे नहीं थे, HRESULT
प्रकार अभी भी त्रुटि कोड के इतिहास में सबसे खराब, निचले नास्टेस्ट त्रुटि कोड है। हम अभी भी 2010 में HRESULT को क्यों देख रहे हैं मेरे बाहर है। मेरा मतलब है कि यदि आप इंटरऑप कर रहे हैं या पी/इन बातों को आमंत्रित करते हैं लेकिन ... HRESULT के पास सिस्टम में कोई स्थान नहीं है। अपवाद। HRESULTs System.Exception की proboscis पर एक वार्ट हैं।
लेकिन गंभीरता से, इसका मतलब है कि मुझे अपवाद डेटा के हिस्से के रूप में पारित होने वाली समान जानकारी को समझने के लिए बहुत विस्तृत विशिष्ट त्रुटि-हैंडलिंग कोड सेट करना होगा। अपवाद बेकार हैं अगर वे आपको इस तरह काम करने के लिए मजबूर करते हैं। मैं क्या गलत कर रहा हूं?
संपादित करें। एक दिन लेटर
सभी टिप्पणियों और प्रतिक्रियाओं के लिए धन्यवाद। मैं यहां एक सामान्य सबक सीख रहा हूं ("त्रुटि संदेश चूसना") भले ही मैंने विशिष्ट समस्या को हल नहीं किया हो। यहां विशिष्ट परिदृश्य है जिसके साथ मैं deaing कर रहा हूँ।
हमारा एप्लिकेशन किसी तृतीय पक्ष द्वारा उत्पादित XML फ़ाइलों का उपभोग करता है। इन एक्सएमएल फ़ाइलों में कभी-कभी अवैध वर्ण होते हैं जिनके पास वास्तव में कोई XML फ़ाइल में कोई व्यवसाय नहीं होता है। ये अवैध वर्ण एक (वैध) XmlReader को "अवैध एक्स ऑन लाइन एक्स" अपवाद के साथ उड़ाते हैं। हमें इन फ़ाइलों को संसाधित करना होगा, हालांकि, हम केवल उपयोगकर्ता को नहीं बता सकते हैं, "क्षमा करें, वह फ़ाइल नहीं है आधिकारिक एक्सएमएल स्पेक के अनुरूप है। "हमारे उपयोगकर्ता वास्तव में यह भी नहीं जानते कि एक्सएमएल क्या है।
माइक्रोसॉफ्ट के पास इस मामले में एक आधिकारिक (और मेरे लिए काफी अजीब) सिफारिश है (जिस मामले में एक XML दस्तावेज़ में अवैध वर्ण हैं) : फ़ाइल को स्ट्रीम में लोड करने के लिए, त्रुटि वाली विशिष्ट रेखा (जैसा कि प्रदान किया गया है, विडंबनात्मक रूप से, XmlException ऑब्जेक्ट में), और एक कानूनी के साथ अपमानजनक चार को प्रतिस्थापित करने के लिए पुन: स्थापित करें। फिर दस्तावेज़ को मान्य करने में लोड करने का प्रयास करें XmlReader फिर से, और अगर यह उड़ाता है तो देख रहा है। Knowledge Base article तकनीक का वर्णन करता है।
तो ठीक है, हम यह कर रहे हैं, और यह काफी अच्छी तरह से काम करता है। समस्या यह है कि कभी-कभी ये एक्सएमएल फाइलें अन्य तरीकों से विकृत होती हैं: वे खाली हो सकती हैं, हो सकता है कि वे एक बंद टैग खो रहे हों।इसलिए यदि आप एमएस सिफारिश का पालन करते हैं, तो आप वास्तव में अपने "अवैध वर्णों को प्रतिस्थापित करें" तर्क को पकड़ ब्लॉक में जोड़ रहे हैं जहां आप मान्य पाठक द्वारा दिए गए मूल अपवाद को पकड़ते हैं।
यह ठीक है अगर अपवाद वास्तव में एक "अवैध चार" अपवाद है। लेकिन अगर यह "मूल तत्व अनुपलब्ध" या "गुम बंद टैग" अपवाद है, तो आप पाते हैं कि एमएस तकनीक में घुसपैठ करने वाले चार स्वयं को उड़ाते हैं, क्योंकि न केवल अपमानजनक चार है, वहां कोई नहीं है बिल्कुल अक्षर, या वहां हैं, लेकिन वे अमान्य रूप से गठित एक्सएमएल हैं, या जो भी हो। इस बिंदु पर आप एक दोगुनी-नेस्टेड कैच-इन-कैच में हैं, आपके बालों की बारी बारी से गिर रही है और गिर रही है, आपकी आंखें कैफीन थकान के साथ लाल लाल हैं, और आप सैनिटी से पूछताछ कर रहे हैं, अकेले उपयोगिता को छोड़ दें वास्तविक दुनिया एक्सएमएल के खिलाफ पाठकों को मान्य करने का उपयोग करना।
तो मुझे उस प्रारंभिक पकड़ (एक्सएमएलएक्सप्शन) ब्लॉक में बताए जाने का एक तरीका है, चाहे वह "रूट तत्व गायब" या "अमान्य चार" अपवाद है, इसलिए मैं उचित कार्रवाई कर सकता हूं। एक चीज जिसे हम नहीं कर सकते हैं, हमारे उपयोगकर्ताओं को ऐसे दस्तावेज़ को खोलने से रोकता है जिसमें कुछ अमान्य वर्ण होते हैं। हमें उन दस्तावेजों को संसाधित करना होगा, और मुझे लगता है कि यह एकमात्र समाधान की तरह दिख रहा है कि समय से पहले दस्तावेज़ में हर चार के माध्यम से इसे फिर से चालू किया जाए, इसे एक्सएमएल की बजाय टेक्स्ट स्ट्रीम के रूप में देखना, अवैध वर्ण ढूंढें, उन्हें प्रतिस्थापित करें, फिर वैध XmlReader के साथ चीज़ को लोड करें और यदि यह उड़ाता है, तो हम जानते हैं कि यह एक अवैध चार अपवाद नहीं है, क्योंकि हमने पहले से ही अवैध वर्णों को तोड़ दिया था।
ऐसा करने से पहले मैंने सोचा कि मैं कम से कम पूछूंगा 1) क्या हम XmlException ऑब्जेक्ट से बेहतर जानकारी प्राप्त कर सकते हैं और मुझे उम्मीद थी कि कोई मुझे बताएगा 2) "XmlException.Message स्ट्रिंग को बंद करना ठीक है। कहें कि यह स्थानीय है लेकिन यह वास्तव में नहीं है। यह स्ट्रिंग विंडोज के सभी संस्करणों और संस्कृतियों में समान होगी। "
लेकिन किसी ने मुझे यह नहीं बताया है।
RageOverflow.com पर निर्भर करता है? –
क्या यह आपके द्वारा लिखे गए कोड का एक टुकड़ा है या आप जिस लाइब्रेरी को कॉल कर रहे हैं? यदि यह पूर्व है तो आपको शायद अलग-अलग अपवाद उठाना चाहिए। यदि यह उत्तरार्द्ध है तो आप इतना कुछ नहीं कर सकते हैं। – ChrisF
हमें बताएं कि आपको लगता है कि आपको उन अपवादों के बीच अंतर करने की आवश्यकता क्यों है, उदाहरण के लिए एक ठोस उदाहरण के साथ। इस तरह हम आपकी समस्या को हल करने में आपको सलाह देंगे। – Steven