क्या कोई ऐसा है जो मैं AccessViolationException
पकड़ने के लिए कर सकता हूं? इसे एक अप्रबंधित डीएलएल द्वारा फेंक दिया जा रहा है जिसे मैं नियंत्रित नहीं करता हूं।क्या .NET में एक्सेस उल्लंघन अपवाद को पकड़ना संभव है?
उत्तर
आपको नहीं करना चाहिए। एक प्रवेश उल्लंघन एक गंभीर समस्या है: यह एक अमान्य स्मृति पता (या पढ़ने के लिए) लिखने का एक अप्रत्याशित प्रयास है। चूंकि जॉन ने पहले से ही स्पष्ट किया है, अप्रबंधित डीएलएल पहले से ही उल्लंघन उल्लंघन के पहले प्रक्रिया स्मृति को दूषित कर सकता है। वर्तमान प्रक्रिया के किसी भी हिस्से पर इसका अप्रत्याशित प्रभाव हो सकता है।
सबसे सुरक्षित बात यह है कि संभवतः उपयोगकर्ता को सूचित करें और फिर तुरंत बाहर निकलें।
कुछ और विवरण: एक एक्सेस उल्लंघन एक ओएस अपवाद है (एक तथाकथित एसईएच या संरचित अपवाद हैंडलिंग अपवाद)। System.Exception
से प्रबंधित सीएलआर अपवादों की तुलना में यह एक अलग तरह का अपवाद है। आप शायद ही कभी प्रबंधित कोड में SEH अपवाद देखेंगे, लेकिन यदि कोई होता है, उदा। अप्रबंधित कोड में, सीएलआर इसे प्रबंधित कोड पर पहुंचाएगा जहां आप इसे पकड़ने में भी सक्षम हैं।
हालांकि, एसईएच अपवादों को पकड़ना ज्यादातर एक अच्छा विचार नहीं है। अधिक जानकारी MSDN पत्रिका में लेख Handling Corrupted State Exceptions जहां निम्न पाठ यह से लिया से वर्णन किया गया:
CLR हमेशा कार्यक्रम में ही द्वारा उठाए गए अपवाद के रूप में एक ही प्रक्रियाओं का उपयोग करके प्रबंधित कोड के SEH अपवाद जन्म दिया है। यह तब तक कोई समस्या नहीं है जब तक कोड असाधारण स्थितियों को संभालने का प्रयास नहीं करता है, जिसे उचित रूप से संभाल नहीं सकता है। अधिकांश उल्लंघन एक्सेस उल्लंघन के बाद निष्पादन को सुरक्षित रूप से जारी नहीं रख सकते हैं। दुर्भाग्यवश, सीएलआर के अपवाद हैंडलिंग मॉडल ने हमेशा उपयोगकर्ताओं को सिस्टम के शीर्ष पर किसी अपवाद को पकड़ने की अनुमति देकर इन गंभीर त्रुटियों को पकड़ने के लिए प्रोत्साहित किया है। अपवाद पदानुक्रम। लेकिन यह शायद ही कभी सही काम है।
यह .NET 3.5 जब तक सच था। .NET 4 में व्यवहार बदल दिया गया है। यदि आप अभी भी इस तरह के अपवादों को पकड़ने में सक्षम होना चाहते हैं तो आपको app.config में legacyCorruptedStateExceptionsPolicy=true
जोड़ना होगा। उपरोक्त लिखित कला में और विवरण।
आप कॉल-कैच ब्लॉक के साथ अप्रबंधित डीएलएल को कॉल लपेट सकते हैं। AccessViolationExceptions सामान्य रूप से पकड़ा जा सकता है। दोनों संदेशों निम्न कोड दिखाता निष्पादित:
try
{
throw new AccessViolationException();
}
catch (Exception e)
{
MessageBox.Show(e.Message + e.StackTrace, e.Message, MessageBoxButtons.OK, MessageBoxIcons.Error);
}
MessageBox.Show("Still running..");
संपादित करें: .NET 4 की शुरुआत की एक change in behavior, यह अब संभव नहीं भ्रष्ट अपवादों को पकड़ने के लिए जब तक आप विशेष रूप से "ask" क्रम ऐसा करने के लिए है।
सवाल यह है कि, यह एक अच्छा विचार ऐसा करने के लिए है:
आप System.Runtime.ExceptionServices.HandleProcessCorruptedStateExceptions
विशेषता के साथ अपने प्रबंधित विधि चिह्नित कर सकते हैं? उपयोगकर्ता को एक अच्छा और मैत्रीपूर्ण संदेश प्रदर्शित करना और लॉग लिखना समझदार हो सकता है। लेकिन उससे आगे काम करना एक अच्छा विचार नहीं है ... –
rioki
शायद नहीं, कम से कम नहीं, अगर आप बिल्कुल सकारात्मक नहीं हैं कि कुछ भी बुरा नहीं हुआ। – andyp
यह काम नहीं करता है। मैंने अपवाद और AccessViolationException दोनों को पकड़ने की कोशिश की है, लेकिन यह मेरे पकड़ ब्लॉक को अनदेखा करता है। मुझे लगता है कि मुझे कुछ app.config झंडा चाहिए जो मुझे चाहिए। –
सबसे पहले मैं 0xA3 के साथ पूरी तरह से एक। लेकिन अगर कोई रास्ता नहीं है तो आप गंदे अप्रबंधित डीएल को अपनी प्रक्रिया में लपेट सकते हैं और आईपीसी (टीसीपी/आईपी, नामपतियों, आदि) के माध्यम से डेटा स्थानांतरित कर सकते हैं। सभी अपवादों को पकड़ें और मेजबान प्रक्रिया को सूचित करें। तो आपकी मेजबान प्रक्रिया ज्यादातर स्मृति भ्रष्टाचार से बचाती है।
हां।
आपकी ऐप में।confg, <configuration>
टैग में निम्न कोड खटखटाने:
<runtime>
<legacyCorruptedStateExceptionsPolicy enabled="true"/>
</runtime>
अब आप किसी भी अन्य की तरह भ्रष्ट अपवादों (सीएसई) को पकड़ने के लिए सक्षम होना चाहिए।
नोट: यदि आप पहले से ही एक क्रम टैग है तो फिर बस <legacyCorruptedStateExceptionsPolicy enabled="true"/>
इसे करने के लिए
ऊपर काम करता है नेट 4.5
वें। मैंने इस मुद्दे के कुछ जवाब पढ़े। सभी कहते हैं "जोड़ें"
के रूप में अन्य लोगों ने बताया, तुम नहीं "संभाल" चाहिए इस हालत के लिए, जोड़ने लेकिन विकास के दौरान समस्या निवारण के लिए इसे पकड़ना आसान है।
[HandleProcessCorruptedStateExceptions]
public void MyMethod()
{
try
{
NaughtyCall();
}
catch (AccessViolationException e)
{
// You should really terminate your application here
}
}
- 1. जावा में मेमोरी अपवाद को पकड़ना संभव है?
- 2. एक्सेस उल्लंघन उल्लंघन त्रुटियों को डीबग करना?
- 3. संदर्भ प्रबंधक में अपवाद को पकड़ना __enter __()
- 4. क्या एकाधिक वेक ताले पकड़ना संभव है?
- 5. पायथन: विशिष्ट अपवाद को पकड़ना
- 6. विशिष्ट अपवाद पकड़ना
- 7. रनटाइम अपवादों को छोड़कर सभी अपवादों को पकड़ना संभव है?
- 8. क्या ऐसा अपवाद पकड़ना संभव है जिसे आप संभाल नहीं सकते (सी # में)?
- 9. अलग थ्रेड पर अनचाहे अपवाद को पकड़ना
- 10. थ्रेड के अनचाहे अपवाद को पकड़ना
- 11. एक्सेस उल्लंघन: संरक्षित मेमोरी को पढ़ने या लिखने का प्रयास
- 12. अपवाद पहुंच उल्लंघन जावा?
- 13. क्या अधिक सामान्य प्रकार की अपवाद पकड़ना अच्छा होता है?
- 14. क्या .NET में निष्क्रिय लॉगिंग संभव है?
- 15. वेब सेवा में FaultException को पकड़ना
- 16. जावा ईई वेब ऐप्स में हर अपवाद को पकड़ना
- 17. क्या .NET में रंग में कंसोल को लिखना संभव है?
- 18. जावास्क्रिप्ट में "NullPointerExceptions" को पकड़ना
- 19. WM_PAINT में पहुंच उल्लंघन
- 20. फेसबुक क्या उपयोगकर्ता के डेटा को पकड़ना और आईफ्रेम में एक फॉर्म पॉप्युलेट करना संभव है?
- 21. क्या जावास्क्रिप्ट एसिंक कॉलबैक में फेंकने वाले अपवादों को पकड़ना संभव है?
- 22. एक्सेस उल्लंघन का पता लगाएं 0xC00000FD
- 23. अपवाद जब एमएस एक्सेस
- 24. django टेम्पलेट्स में अपवादों को पकड़ना
- 25. डेल्फी एक्सेस उल्लंघन त्रुटि रिकॉर्ड प्रकार
- 26. .NET Remoting में "टीसीपी चैनल प्रोटोकॉल उल्लंघन प्रक्षेपण की अपेक्षा" का क्या कारण बनता है?
- 27. सीएक्सएफ के साथ webservice अपवाद को पकड़ना: NoClassDefFoundError: SOAPFaultBuilder
- 28. CreateProcess() किसी एक्सेस उल्लंघन के साथ विफल रहता है
- 29. यदि नल पॉइंटर अपवाद को पकड़ना अच्छा अभ्यास नहीं है, तो अपवाद को एक अच्छा पकड़ रहा है?
- 30. अनधिकृत एक्सेस अपवाद बनाम सुरक्षा अपवाद
स्पष्टीकरण के लिए: आप ASAP से बाहर निकलने का कारण यह है कि आप यह नहीं जानते कि अप्रबंधित डीएलएल ने एक्सेस उल्लंघन को हिट करने से पहले ओवरराइट किया था। हो सकता है कि यह पर्याप्त स्थानों पर कचरा लिख रहा हो कि आपका प्रोग्राम सुरक्षित रूप से जारी नहीं हो सकता है। –
@ जॉन सॉंडर्स: स्पष्टीकरण के लिए धन्यवाद। मैंने अपना जवाब अपडेट किया। –
मैं इसे पकड़ने के लिए एक बहुत ही अच्छे कारण के बारे में सोच सकता हूं: यदि आपके पास एक मानव रहित प्रक्रिया है और आपके पास यह नहीं है, तो बाहर निकलने के बजाय, प्रक्रिया एक्सेस उल्लंघन उल्लंघन संवाद बॉक्स के साथ लटकाएगी, विशेष रूप से कोई भी नहीं दिखा रहा है। इसे पकड़ने से आप उस संवाद के बिना बाहर निकल सकते हैं। – jpwkeeper