Gethrforexception - ioexception - सी #
System. Exception. HResult संपत्ति सुरक्षित है मैं किसी अपवाद के अंदर कैसे झलक सकता हूं और एचआरएसल्ट प्राप्त कर सकता हूं या फिर प्रतिबिंब या अन्य बदसूरत हैक्स का इस्तेमाल न कर सकता हूं: मुझे एक बैकअप उपकरण लिखना है, जो एक सिस्टम पर फाइल खोलकर पढ़ता है। मैं फ़ाइल को FileAccess के साथ खोलता हूँ। पढ़ें और फ़ाइलशेयर। रीड-राइट, इस मार्गदर्शन के अनुसार। क्योंकि मुझे इस बात पर ध्यान नहीं दिया जाता है कि फाइल लिखने के लिए खुले समय पर मैंने इसे पढ़ा है। कुछ मामलों में, जब मैं पढ़ रहा हूँ एक फाइल एक और ऐप द्वारा खुली है, सिस्टम। आईओ। फ़िलीस्ट्रीम। रीड () विधि एक सिस्टम। आईओईओएक्सेशन को फेंकता है, प्रक्रिया फ़ाइल को एक्सेस नहीं कर सकती क्योंकि एक अन्य प्रक्रिया के एक हिस्से को लॉक किया गया है फ़ाइल। यह त्रुटि 33 है। या मुझे लगता है कि एचआरएसल्ट 0x80070021 संपादित करें मेरा मानना है कि जब कोई अन्य प्रक्रिया एक फाइल के भीतर बाइट रेंज लॉक करने के लिए LockFileEx को कॉल करता है, तो उसे वापस किया जा सकता है। आईडी को रोकना और पुनः प्रयास करना जब मुझे यह त्रुटि मिलती है। मुझे लगता है कि यह यहां लेने के लिए उपयुक्त कार्रवाई है। अगर लॉकिंग प्रक्रिया बाइट-रेंज लॉक को तुरंत रिलीज़ करती है, तो मैं फ़ाइल को पढ़ना जारी रख सकता हूं। मैं इस कारण के लिए एक IOException कैसे भेद कर सकता हूँ, दूसरों से मैं इन तरीकों से सोच सकता हूं: निजी प्रतिबिंब - ऐसा करना नहीं चाहता Perf बदबू आ रही होगी कॉल अपवाद। टॉस्ट्रिंग () और स्ट्रिंग को पार्स करें। हैक्स लगता है। I18n संस्करणों में अभ्यस्त काम करते हैं मुझे ये विकल्प पसंद नहीं हैं I वहाँ एक बेहतर, क्लीनर तरीका है मैं बस के आसपास खोज की और सिस्टम पाया। समय समय। इंटरपर्सिस। Marshshal. GETHRForException। क्या वह 0x80070021 मॉर्शाल की तरह वापसी करेगा। गेटएचआरएफएक्साशन सिर्फ गेट-एचआर-अप-एक्सपैशन के अलावा नहीं करता है Let8217s पहले एक छोटा कोड स्निपेट देखकर शुरू होता है: यह बिल्कुल ठीक नहीं है, सही नहीं है यह पता चला है कि इस एपीआई को वास्तव में खराब नाम दिया गया है, और यह वास्तव में अपवाद ऑब्जेक्ट से एचआर को पुनः प्राप्त करने से अधिक है। इस एपीआई का प्रयोग करना गलत तरीके से आपको कुछ अजीब समस्याएं दे सकता है, जैसे कि एक गलत, पुराने अपवाद फेंकना। तो एपीआई वास्तव में आपको HRESULT लौटने के अलावा क्या करता है, यह फ़ंक्शन वर्तमान धागा IErrorInfo ऑब्जेक्ट को अपवाद ऑब्जेक्ट के रूप में सेट करता है। हर धागा में एक एसोसिएटेड IErrorInfo COM ऑब्जेक्ट है, जो शून्य के लिए डिफ़ॉल्ट है। यह IErrorInfo ऑब्जेक्ट पिछले COM API कॉल से विफलता का प्रतिनिधित्व करता है, जो कि GetLastError () Win32 API, या errno C api की तरह है। IErrorInfo ऑब्जेक्ट से, आप त्रुटि विवरण, सहायता फ़ाइल संदर्भ आदि जैसी अधिक जानकारी प्राप्त कर सकते हैं, जिससे आपको त्रुटि के बारे में अधिक जानकारी मिलती है। IErrorInfo ऑब्जेक्ट अपवाद ऑब्जेक्ट को सेट करके (वास्तव में अपवाद ऑब्जेक्ट के आईईआरआरइन्फो कार्यान्वयन पर सेट है, जिसे सभी प्रबंधित ऑब्जेक्ट्स द्वारा साझा किया जाता है), आप अनिवार्य रूप से आपके कॉम कॉलर्स को बता रहे हैं, एक विफलता है, यह विफलता है, यह अपवाद ऑब्जेक्ट है, और आपको इसके बारे में कुछ करना चाहिए, जो स्पष्ट रूप से एक बुरा विचार है यदि आप केवल मानव संसाधन को पुनः प्राप्त करना चाहते हैं कई मामलों में, यह किसी का ध्यान नहीं जा सकता है, अगर आपके COM कॉलर्रैले IErrorInfo को सही ढंग से संभालता है उद्धरण चिह्नों से, मेरा मतलब है कि वे COM IErrorInfo प्रोटोकॉल का अनुसरण करते हैं, जो मूल रूप से हैं: 1. कॉलर वर्तमान थ्रेड से IErrorInfo का उपयोग करते हुए एक COM इंटरफ़ेस को कॉल करते हैं जो कि स्पष्ट रूप से quotI समर्थन IErrorInfoquot 2. कहते हैं (जो COM इंटरफ़ेस लागू करता है) quotI समर्थन IErrorInfoquot, लौटने से पहले IErrorInfo को साफ करना चाहिए। यह GetLastError () errno के समान है, ठीक है अगर यह मामला है, तो गलत तरीके से सेट IErrorInfo को थ्रेड में, आमतौर पर या तो कुछ इंटरफ़ेस कार्यान्वयन द्वारा ओवरराइट किया गया है जो IErrorInfo का समर्थन करता है, या अनदेखा कर दिया गया है। हालांकि, चूंकि मैं वर्णित प्रोटोकॉल वास्तव में हर COM डेवलपर द्वारा बहुत अच्छी तरह से समझ में नहीं आ रहा है, I8217ve अक्सर मामलों को देखा जहां COM घटक सिर्फ quossure कहता है, मैं हर COM इंटरफ़ेस पर IErrorInfo का समर्थन करता है, और वे don8217t setclear IErrorInfo बिल्कुल भी। और फिर, इस खराब आरोपित कॉम इंटरफ़ेस के कॉल करने वाला, पहले से GetHRForException कॉल द्वारा सेट IErrorInfo का उपयोग करके समाप्त होगा, और यह मानना है कि कोई त्रुटि है। उदाहरण के लिए, let8217 में निम्न परिदृश्य पर विचार करें: कुछ COM घटक कोड कोड में कॉल अपवाद फेंक देते हैं, IOException कोड अपवाद फैलाता है, और मार्शल को कॉल करें। GETHRForException, जो इस अपवाद के लिए IErrorInfo सेट करता है IOException कोड को किसी अन्य COM घटक B में कॉल करता है आईबी में। फंक आईबी। फंक विफल हो गया और कुछ मानव संसाधन विफलता कोड वापस लौटा, कहते हैं, ईयूटीएफएमएमआरआई सीएलआर एचआर असफलता कोड को देखता है, और कॉम बी बी से पूछता है कि आप आईईआरआरआईइन्फॉउट का समर्थन करते हैं, और बी क्वाटस का जवाब देते हैं, क्यों नहीं, इसके अलावा, यह doesn8217t वास्तव में इसका समर्थन करता है और यह doesn8217t setclear IErrorInfo CLR को IErrorInfo पुनर्प्राप्त करता है, और देखता है कि यह वास्तव में एक प्रबंधित अपवाद है, और OutOfMemoryException के बजाय IOException अपवाद को बाहर निकालता है। अब, आप सोच सकते हैं: यह एपीआई वास्तव में पहली जगह के लिए क्या करना है वास्तव में इसका उपयोग COM इंटरॉप में किया जाता है, जहां आप HRESULT को वापस करना चाहते हैं और अपने द्वारा IErrorInfo सेट करना चाहते हैं। यह बहुत अधिक बार होता है 8211 अधिकांश लोग पर्याप्त रूप से खुश हो सकते हैं कि COM इंटरॉप अपवाद को एचआर और आईईआरआरएन्फ़ोन्फ़ (जो मार्शल को कॉल करने के लिए होता है। GETHRForException) करके उस हिस्से की देखभाल करता है। इसलिए जब तक आप वास्तव में नहीं जानते कि आप क्या कर रहे हैं, मेरी सलाह है कि मार्शल से दूर रहें। GetHRForException यदि आप वास्तव में, वास्तव में केवल एक विशिष्ट अपवाद के लिए HRESULT प्राप्त करना चाहते हैं, तो आपको अपवाद का उपयोग करना चाहिए। HRsult संपत्ति
Comments
Post a Comment