2010-06-08 14 views
12

सभी चीजों के प्यार के लिए पवित्र, आप पूर्वनिर्धारित .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 स्ट्रिंग को बंद करना ठीक है। कहें कि यह स्थानीय है लेकिन यह वास्तव में नहीं है। यह स्ट्रिंग विंडोज के सभी संस्करणों और संस्कृतियों में समान होगी। "

लेकिन किसी ने मुझे यह नहीं बताया है।

+8

RageOverflow.com पर निर्भर करता है? –

+0

क्या यह आपके द्वारा लिखे गए कोड का एक टुकड़ा है या आप जिस लाइब्रेरी को कॉल कर रहे हैं? यदि यह पूर्व है तो आपको शायद अलग-अलग अपवाद उठाना चाहिए। यदि यह उत्तरार्द्ध है तो आप इतना कुछ नहीं कर सकते हैं। – ChrisF

+2

हमें बताएं कि आपको लगता है कि आपको उन अपवादों के बीच अंतर करने की आवश्यकता क्यों है, उदाहरण के लिए एक ठोस उदाहरण के साथ। इस तरह हम आपकी समस्या को हल करने में आपको सलाह देंगे। – Steven

उत्तर

7

मैं सिद्धांत रूप से आपसे पूरी तरह से सहमत हूं, लेकिन उन उदाहरणों की संख्या जहां मुझे वास्तव में अपवाद को फेंकने के सही कारण के बारे में परवाह है (मेरे कोड में) बहुत छोटा है।

उदाहरण के रूप में XmlException का उपयोग करना, क्या वास्तव में आपके कोड में कुछ अलग व्यवहार होगा यदि दस्तावेज़ बहुत लंबा बनाम था। यदि उसके पास अमान्य वर्ण थे?

एकमात्र उदाहरण मैं सोच सकता हूं कि मैंने कभी भी वास्तव में देखभाल की है कि SQL टाइप अपवादों के लिए जहां कुछ त्रुटियों को पुनर्प्राप्त किया जा सकता है (उदा। खो डेटाबेस डेटाबेस)।

ईटीए:

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

+2

+1। जब यह विफल हो जाता है, तो यह विफल हो जाता है। बस अपने उपयोगकर्ता से कहें कि विफल हो गया है, और लॉग इन में तकनीकी विवरणों को कहीं भी स्टोर करें। –

+0

@ क्लेमेंट: हाँ ... लेकिन अगला कदम क्या है? जब तक आपका सॉफ़्टवेयर बड़े पैमाने पर $ 49.99 के लिए उत्पादन नहीं करता है, तो अगला चरण क्लाइंट आपका समर्थन नंबर और लात मारने और चीखने वाला होगा। आप अपने समर्थन गिरोहों की मदद करना चाहते हैं जिनकी नौकरी आपके गधे को ढंकना है, है ना? –

+0

@ हैमिश - यही कारण है कि आप एक त्रुटि लॉग में विवरण लॉग इन करते हैं। आप उपयोगकर्ता को विवरण दे सकते हैं, लेकिन वे बस इसे पिछले पर क्लिक करेंगे और संदेश को अनदेखा करेंगे। –

4

यहां यह समस्या XmlException से प्राप्त होने वाला खराब संदेश प्रतीत होता है। यह एक एपीआई डिजाइन मुद्दा है।

एक विकल्प या तो System.Xml से System.Xml.Linq और एक अलग त्रुटि कोड प्राप्त करने के लिए XDocument का उपयोग करके एक अलग लाइब्रेरी का उपयोग करें।

यदि इनमें से कोई भी काम नहीं है तो आप ओपन सोर्स एक्सएमएल पार्सर जैसे NDigester का उपयोग कर सकते हैं और अधिक विस्तार त्रुटि देने के लिए कोड को संशोधित कर सकते हैं।

+0

एचएम मैं समुदाय-परीक्षण अच्छी लाइब्रेरी की तुलना में एक अच्छी तरह से परीक्षण की गई क्रैपी लाइब्रेरी का उपयोग करूंगा। खैर, आप जो तैयार कर रहे हैं उस पर निर्भर करता है, मुझे लगता है। Ndigester - 2% 2% उपयोगकर्ता इस परियोजना की अनुशंसा करते हैं;) –

+1

मैं मानता हूं कि यह एक एपीआई मुद्दा है। मुझे लगता है कि डिज़ाइन ठीक है - XmlException * में * इन क्षेत्रों जैसे HResult, डेटा इत्यादि हैं। इसमें इस जानकारी को ले जाने की क्षमता है। लेकिन जो भी XmlReader, XmlDocument, आदि लिखा है, उन क्षेत्रों को भरने के लिए उपेक्षित, इसलिए वे प्रभावी रूप से बेकार हैं। और ऐसा लगता है कि पूरे .NET पुस्तकालय में होता है। मैंने कभी * अपवाद का उपयोग नहीं किया है। HResult क्योंकि यह लगभग कभी भी एक मूल्य नहीं है जिसका मैं उपयोग कर सकता हूं। और अपवाद। डेटा? एक महत्वपूर्ण मूल्य संग्रह बस वहां बैठा है, मुझे अपनी खालीपन से निराश करने का इंतजार कर रहा है। –

1

ऐसा लगता है कि एक एक्सएमएल पार्सिंग दिनचर्या की आवश्यकता है, जो एक पार्सिंग त्रुटि होने पर अपवाद फेंकने के बजाय, एक पास-इन प्रतिनिधि को आमंत्रित करता है।यदि प्रतिनिधि पार्सिंग राज्य से संबंधित जानकारी स्वीकार करता है, तो यह जो भी फिक्सअप आवश्यक था, कोशिश कर सकता है और एक मान वापस कर सकता है कि फ़ाइल के अपमानजनक हिस्से का पुनर्मूल्यांकन किया जाना चाहिए।

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

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