AccessViolationException को कैसे हैंडल करें


184

मैं अपने .net अनुप्रयोग से COM ऑब्जेक्ट (MODI) का उपयोग कर रहा हूं। मैं जिस पद्धति को कॉल कर रहा हूं वह एक System.AccessViolationException है, जो विज़ुअल स्टूडियो द्वारा इंटरसेप्ट की गई है। विचित्र बात यह है कि मैंने अपने कॉल को एक कोशिश के कैच में लपेटा है, जिसमें AccessViolationException, COMException और अन्य सभी चीज़ों के लिए हैंडलर हैं, लेकिन जब Visual Studio (2010) AccessViolationException को स्वीकार करता है, तो डिबगर विधि कॉल (doc.OCR) पर टूट जाता है, और अगर मैं आगे बढ़ता हूं, तो यह कैच ब्लॉक में प्रवेश करने के बजाय अगली पंक्ति तक जारी रहता है। इसके अतिरिक्त, अगर मैं इसे दृश्य स्टूडियो के बाहर चलाता हूं तो मेरा एप्लिकेशन क्रैश हो जाता है। मैं COM ऑब्जेक्ट के भीतर फेंके गए इस अपवाद को कैसे संभाल सकता हूं?

MODI.Document doc = new MODI.Document();
try
{
    doc.Create(sFileName);
    try
    {
        doc.OCR(MODI.MiLANGUAGES.miLANG_ENGLISH, false, false);
        sText = doc.Images[0].Layout.Text;
    }
    catch (System.AccessViolationException ex)
    {
        //MODI seems to get access violations for some reason, but is still able to return the OCR text.
        sText = doc.Images[0].Layout.Text;
    }
    catch (System.Runtime.InteropServices.COMException ex)
    {
        //if no text exists, the engine throws an exception.
        sText = "";
    }
    catch
    {
        sText = "";
    }

    if (sText != null)
    {
        sText = sText.Trim();
    }
}
finally
{
    doc.Close(false);

    //Cleanup routine, this is how we are able to delete files used by MODI.
    System.Runtime.InteropServices.Marshal.FinalReleaseComObject(doc);
    doc = null;
    GC.WaitForPendingFinalizers();
    GC.Collect();
    GC.WaitForPendingFinalizers();

}

क्या आपने Exceptionसभी अपवादों को फंसाने के लिए (अस्थायी रूप से!) एक हैंडलर लगाने की कोशिश की है और देखें कि वास्तव में अपवाद क्या है?
ChrisF

3
@ क्रिस - हां, अंतिम कैच हैंडलर देखें? यह अपवाद और अपवाद के किसी भी उपवर्ग सहित सब कुछ पकड़ना चाहिए। साथ ही, विज़ुअल स्टूडियो की रिपोर्ट है कि अपवाद System.AccessViolationException
जेरेमी

जवाबों:


299

.NET 4.0 में, रनटाइम कुछ अपवादों को संभालता है जो कि विंडोज स्ट्रक्चर्ड एरर हैंडलिंग (SEH) त्रुटियों के रूप में भ्रष्ट राज्य के संकेतक के रूप में उठाए गए हैं। इन भ्रष्ट राज्य अपवादों (CSE) को आपके मानक प्रबंधित कोड द्वारा पकड़े जाने की अनुमति नहीं है। मैं यहाँ या कैसे यहाँ नहीं मिलेगा। .NET 4.0 फ्रेमवर्क में CSE के बारे में यह लेख पढ़ें:

http://msdn.microsoft.com/en-us/magazine/dd419661.aspx#id0070035

लेकिन उम्मीद है। इसको प्राप्त करने के कुछ तरीके हैं:

  1. .NET 3.5 असेंबली के रूप में पुनरावर्ती और इसे .NET 4.0 में चलाएं।

  2. कॉन्फ़िगरेशन / रनटाइम तत्व के तहत अपने एप्लिकेशन की कॉन्फ़िगरेशन फ़ाइल में एक पंक्ति जोड़ें: <legacyCorruptedStateExceptionsPolicy enabled="true|false"/>

  3. जिन विधियों को आप इन अपवादों को HandleProcessCorruptedStateExceptionsविशेषता के साथ पकड़ना चाहते हैं उन्हें सजाएँ। देखें http://msdn.microsoft.com/en-us/magazine/dd419661.aspx#id0070035 जानकारी के लिए।


संपादित करें

पहले, मैंने अतिरिक्त विवरण के लिए एक मंच पोस्ट का संदर्भ दिया। लेकिन जब से Microsoft Connect सेवानिवृत्त हुआ है, यहां आपकी रुचि के मामले में अतिरिक्त विवरण दिए गए हैं:

गौरव खन्ना, Microsoft CLR टीम के एक डेवलपर से

यह व्यवहार CLR 4.0 की एक विशेषता के कारण डिज़ाइन द्वारा है जिसे भ्रष्ट राज्य अपवाद कहा जाता है। सीधे शब्दों में कहें, प्रबंधित कोड को अपवाद प्रक्रिया को पकड़ने का प्रयास करना चाहिए जो भ्रष्ट प्रक्रिया राज्य को इंगित करता है और एवी उनमें से एक है।

इसके बाद वह HandleProcessCorruptedStateExceptionAttribute और उपरोक्त लेख पर प्रलेखन का संदर्भ देता है । यदि आप इस प्रकार के अपवादों को पकड़ने पर विचार कर रहे हैं, तो कहने के लिए पर्याप्त है, यह निश्चित रूप से पढ़ने लायक है।


12
HandleProcessCorruptedStateExceptionsमेरे लिए .net 4.5 में काम करता है।
हिरणो

2
धन्यवाद villecoder, आप एक रत्न हैं! मैं इस समस्या से हफ्तों से जूझ रहा हूं, जड़ समस्या को हल करने की कोशिश कर रहा हूं, और आखिरकार लक्षण का इलाज करने के लिए खुद को इस्तीफा दे दिया। आपका समाधान एकदम सही है।
गिल्डडिफिश

19
! जागरूक होने के लिए: AccessViolationException के बाद की प्रक्रिया को समाप्त करने की अत्यधिक अनुशंसा की जाती है जो कि एक भ्रष्ट राज्य अपवाद (CSE) है। अन्यथा यह अधिक महत्वपूर्ण त्रुटियों को जन्म दे सकता है।
Zbigniew Wiadro

6
धन्यवाद, यह वास्तव में मददगार है, हालांकि पहले तो मुझे यह धारणा मिली कि मुझे इन अपवादों को पकड़ने में सक्षम होने के लिए सभी 3 चरणों को करने की आवश्यकता है, जबकि यह वास्तव में ORइसे करने के तरीकों का एक "तार्किक " है। :)
लो

@deerchao मुझे उम्मीद है कि आपने उत्तर में प्रदान की गई 1 लिंक पढ़ ली होगी। CSE अपवादों को हैंडल करना एक बुरा विचार है।
पिक्सेल

17

कॉन्फ़िगरेशन फ़ाइल में निम्न जोड़ें, और इसे आज़माने वाले ब्लॉक में पकड़ा जाएगा। शब्द का सावधानी ... इस स्थिति से बचने की कोशिश करें, क्योंकि इसका मतलब है कि किसी प्रकार का उल्लंघन हो रहा है।

<configuration>
   <runtime>
      <legacyCorruptedStateExceptionsPolicy enabled="true" />
   </runtime>
</configuration>

2
जो लोग d ++ के रूप में c ++ / cli का उपयोग करते हैं, उनके लिए कोड को .exe प्रोजेक्ट में जोड़ा जाना चाहिए।
फेलिक्स

9

उपरोक्त उत्तरों से संकलित, मेरे लिए काम किया, इसे पकड़ने के लिए निम्न चरणों का पालन किया।

चरण # 1 - फ़ाइल को कॉन्फ़िगर करने के लिए निम्नलिखित स्निपेट जोड़ें

<configuration>
   <runtime>
      <legacyCorruptedStateExceptionsPolicy enabled="true" />
   </runtime>
</configuration>

चरण 2

जोड़ें -

[HandleProcessCorruptedStateExceptions]

[SecurityCritical]

फ़ंक्शन के शीर्ष पर आप अपवाद को पकड़ रहे हैं

स्रोत: http://www.gisremotesensing.com/2017/03/catch-exception-attempted-to-read-or.html


Msdn.microsoft.com/en-us/library/… के अनुसार , SecurityCriticalAttribute पूर्ण विश्वास के लिए एक लिंक मांग के बराबर है। मुझे नहीं लगता कि वर्णित समस्या पूर्ण विश्वास की मांग करती है।
जेरेमी

0

आप AppDomain.UnhandledException का उपयोग करके देख सकते हैं और देखें कि क्या आप इसे पकड़ सकते हैं।

** संपादित करें *

यहाँ कुछ और जानकारी है जो उपयोगी हो सकती है (यह एक लंबी पढ़ी जाती है)।


2
.NET फ्रेमवर्क में बदलाव के कारण यह उत्तर अब सटीक नहीं है। 4.0 से पहले यह सही है। AccessViolationException के अनुभाग और msdn.microsoft.com/en-us/library/…
Tedford
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.