2011-06-06 14 views
5

मैं एक डीएलएल में काम कर रहा हूं जो कभी-कभी अनचाहे अपवाद उठाता है। मैं पागल कोड का पता लगाने और डीबग करने के लिए madExcept का उपयोग कर रहा हूं, लेकिन जब मैं अंततः अपने डीएलएल को तैनात करता हूं तो मैं अपवाद लॉग करने के लिए डीएलएल के अंदर अपना खुद का वैश्विक अपवाद हैंडलर शामिल करना चाहता हूं।मैं डीएलएल में वैश्विक अपवाद हैंडलर कैसे बना सकता हूं?

तो सवाल यह है कि मैं अपने डेल्फी डीएलएल में वैश्विक अपवाद हैंडलर कैसे सेट कर सकता हूं?

उत्तर

10

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

आप क्या कर सकते हैं अपने डीएलएल में कहीं भी "केंद्रीय अपवाद हैंडलर रूटीन" स्थापित किया गया है। इसे पैरामीटर के रूप में Exception ऑब्जेक्ट लेना चाहिए। फिर अपने सभी निर्यातित दिनचर्या के लिए ऐसा कुछ करें:

procedure MyExportedRoutine(param: integer); 
begin 
    try 
    //do normal stuff 
    except 
    on E: Exception do 
     CentralExeptionHandler(E); 
    end; 
end; 

यह वास्तव में सबसे अच्छा है जब तक आप COM का उपयोग नहीं कर रहे हैं। यदि आप एक COM DLL लिख रहे हैं, तो safecall कॉलिंग सम्मेलन के साथ अपने इंटरफ़ेस विधियों को चिह्नित करें और संकलक चुपचाप आपके लिए कोड उत्पन्न करेगा जो अपवाद प्रसार का ख्याल रखता है।

+4

+1 मुझे लगता है कि आप अपने डीएलएल में सभी प्रविष्टि बिंदुओं के लिए ऐसा करने के लिए मजबूर हैं क्योंकि अपवादों को चाहिए मॉड्यूल सीमाओं में फैलाना नहीं है।प्रवेश बिंदु दिनचर्या के लिए एक आम टेम्पलेट होने के अन्य लाभ भी हैं। उदाहरण के लिए आप सेटलाइन में कॉल जोड़ सकते हैं जो फ़्लोटिंग पॉइंट कंट्रोल शब्द सेट करते हैं और फिर बहाल करते हैं जो अक्सर एक समस्या होती है जब आपका होस्ट ऐप डेल्फी ऐप नहीं होता है। –

10

"वैश्विक अपवाद हैंडलर" से आपका क्या मतलब है?

32-बिट में विंडोज संरचित अपवाद हैंडलिंग (एसईएच), थ्रेड की अपवाद हैंडलर चेन चलकर एक हैंडलर पाता है जिसमें अपवाद हुआ। अपवाद हैंडलर श्रृंखला रिकॉर्ड की एक लिंक्ड सूची है, जिसका सिर FS:[0] में पाया जाता है; रिकॉर्ड सामान्य रूप से स्टैक पर आवंटित किए जाते हैं, प्रत्येक try पर धक्का दिया जाता है और संरक्षित ब्लॉक से बाहर निकलने पर पॉप किया जाता है। प्रत्येक अपवाद रिकॉर्ड द्वारा संदर्भित एक कॉलबैक दिनचर्या है; विंडोज इस खोज चरण के दौरान अपवाद के ब्योरे के साथ इस दिनचर्या को यह निर्धारित करने के लिए कहते हैं कि श्रृंखला का यह "स्तर" अपवाद को "संभाल" देने जा रहा है या नहीं। विंडोज़ फिर अपवाद श्रृंखला को फिर से खोलकर उस बिंदु पर कॉल स्टैक को खोलता है, प्रत्येक कॉलबैक को एक अलग मूल्य के साथ बुलाता है, यह बताते हुए कि अनचाहे चल रहा है, जब तक यह अपवाद को संभालने के लिए चुने गए हैंडलर तक नहीं पहुंच जाता। यदि कोई हैंडलर नहीं मिला है, तो प्रक्रिया को अधिसूचना के बिना, कठिन, समाप्त कर दिया गया है। आम तौर पर ऐसा नहीं होता है; ओएस स्टैक (श्रृंखला में अंतिम तत्व) के तल पर अपने आप के आखिरी मौके हैंडलर स्थापित करता है, और यह आम तौर पर परिचित विंडोज़ को पॉप करता है "इस प्रोग्राम में एक समस्या आई है" संवाद। लेकिन अगर चीजें बहुत भ्रष्ट हो गई हैं, या अपवाद हैंडलर श्रृंखला को हटाने के लिए चारों ओर गड़बड़ कर दी गई है, तो प्रक्रिया मुश्किल हो जाती है।

तो विंडोज अपवाद हैंडलिंग के इस संक्षिप्त अवलोकन से, यह स्पष्ट होना चाहिए कि कोई भी "ग्लोबल" हैंडलर नहीं है, केवल हैंडलर की एक सूची है, प्रति थ्रेड की एक सूची (FS रजिस्टर थ्रेड संदर्भ का हिस्सा है); और "आखिरी मौका" हैंडलर वह है जो ढेर में सबसे पहले स्थापित किया गया है। आपके डीएलएल के अंदर होने वाले अपवाद को पकड़ने का सबसे आसान तरीका है प्रत्येक प्रविष्टि बिंदु पर तुरंत अपवाद हैंडलर स्थापित करना। यह कैसे करें इसे करने के विवरण के लिए मेसन का जवाब देखें (यह try/except के साथ है); लेकिन ध्यान रखें कि यदि आपका डीएलएल कहीं और वापस कॉल करता है (उदा। कॉलबैक रूटीन के माध्यम से), तो आप उन अपवादों को पकड़ सकते हैं जो आपके लिए "मतलब" नहीं थे और आपके कोड के कारण नहीं थे। (यह डीएलएल स्तर पर तीसरे पक्ष के कोड के माध्यम से अपवादों की अपेक्षा करने के लिए अपर्याप्त शैली है, लेकिन यह हो सकता है।)

+0

ग्रेट जानकारी बैरी! यह मुझे स्पष्ट करता है कि मैंने कभी-कभी "इस कार्यक्रम में एक समस्या का सामना किया है" क्यों देखा है और कभी-कभी मैं नहीं करता हूं। मुझे पता था कि यह इन मामलों में flaky था, और यकीन नहीं था कि क्यों। –

+3

@ वॉरेन बोर्लैंड वास्तव में इस अपवाद हैंडलिंग तकनीक पर पेटेंट था, मुझे लगता है कि अब EMBT में यह है। एमएस ने इसके लिए पैसे का भुगतान किया, लेकिन एक्स 64 हैंडलिंग को संभवतया अलग-अलग लागू किया गया क्योंकि यह पेटेंट किया गया है; पेटेंट एनकंब्रेंस के कारण भी, जीएनयू/एलएलवीएम/आदि उत्कृष्ट एसईएच समर्थन से कम है, जहां तक ​​मुझे पता है। दुर्भाग्यपूर्ण, वास्तव में। –

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