ArcGIS 10 ऐड-इन: शीर्ष-स्तरीय अपवाद हैंडलिंग


10

ArcGIS 10 ऐड-इन मैं काम कर रहा हूं, यह बहुत सरल है - सिर्फ एक टूल कंट्रोल और एक डॉकेबल विंडो। मैं उस विशिष्ट अपवाद को संभाल रहा हूं जिसका मैं स्रोत पर अनुमान लगाने और बाकी सब कुछ फेंकने का अनुमान लगा रहा हूं, लेकिन ऐड-इन फ्रेमवर्क में उन अप्रत्याशित अपवादों को संभालने के लिए सबसे अच्छा अभ्यास क्या है?

मैं वर्तमान में सिर्फ एक कर रहा हूं catch (System.Exception ex)और इसे एक मेसेजबॉक्स में दिखा रहा हूं, जिसमें एक उच्च-स्तरीय पद्धति नहीं है जिसे मैं इसे संभाल सकता हूं, लेकिन यह सबसे अच्छा अभ्यास नहीं लगता है (और निश्चित रूप से, एफएक्सपॉप चमक रहा है इसके बारे में)।

क्या ArcGIS 10 ऐड-इन फ्रेमवर्क में कोई सुविधा शीर्ष स्तर के अपवाद हैंडलर के लिए झुकी जा सकती है, उदाहरण के लिए Application.ThreadExceptionया AppDomain.UnhandledExceptionघटनाओं के लिए?

ऐड-इन्स के रूप में देखकर सिर्फ क्लास लाइब्रेरी हैं और अंतर्निहित एप्लिकेशन के स्टार्टअप कोड तक कोई पहुंच नहीं है (जो मैं इकट्ठा करता हूं, उन घटनाओं को स्टार्टअप प्रक्रिया में बहुत जल्दी हुक करना पड़ता है), मेरा अनुमान नहीं है, लेकिन मुझे लगा कि मैं पूछूंगा कि क्या कोई भी विशेषज्ञ इस बारे में कोई सुझाव देता है कि "अप्रत्याशित" अपवादों को ऐड-इन्स में कैसे संभाला जाना चाहिए।


1
बस FYI करें: यहाँ एक लिंक है जो एश्री पर थोड़ा तय करने की कोशिश कर रहा है
एरिक एल

@ blah238 आपने अपनी समस्या को हल करने के लिए क्या किया है? क्या आप मुझे कुछ अपवादों को संभालने के लिए कृपया संकेत दे सकते हैं?
एमी

अपने कोड के लिए प्रत्येक प्रविष्टि बिंदु पर एक अपवाद हैंडलर रखें।
ब्लाह २३

हर प्रवेश बिंदु पर? !! शीर्ष स्तर से इसे संभालने का कोई और तरीका नहीं है?
ईएमआई

यही मेरी समझ है, हां। यदि आप इसे बेहतर देखना चाहते हैं तो ऊपर @ लिंक देखें।
blah238

जवाबों:


7

जहां तक ​​मैं आपको बता सकता हूं कि त्रुटि से निपटने के कार्यान्वयन को लागू कर रहे हैं, जो वर्तमान में ईएसआरआई सबसे अच्छा अभ्यास है। यदि आप आवेदन के ( आर्कप ) अपवादों को पकड़ कर रखना चाहते थे तो आप संभावित रूप से उन त्रुटियों के बारे में संदेश प्रदर्शित कर सकते थे जो आपके AddIn का हिस्सा नहीं थे। आपके द्वारा लिखे गए अधिकांश AddIns संभवतः बटन होने जा रहे हैं और वास्तव में केवल दो प्रमुख मार्ग हैं जो अप्रत्याशित त्रुटियां पकड़ेंगे और प्रदर्शित किए जाएंगे ( onClick और onUpdate )।

बस ' थ्रो एक्स ' की जगह ' थ्रो ' का इस्तेमाल करना याद रखें । एक मिनट का अंतर है, लेकिन यह त्रुटि के वंश को बनाए रखने में परिणाम करता है क्योंकि इसे फंक्शंस से बुलबुले उठते हैं।


धन्यवाद, यह वही है जो मैंने होने की उम्मीद की थी क्योंकि सभी ईएसआरआई नमूने इसे उसी तरह करते हैं।
ब्लाह 238

@ ट्रॉय श्मिट कृपया मुझे एक पॉइंटर दे सकते हैं, जब मैं एक डॉक करने योग्य विंडो का उपयोग कर रहा हूं, तो मैं अनचाहे अपवादों को कैसे संभाल सकता हूं? और मुझे "थ्रो" कहाँ से और क्या करना चाहिए?
ईएमआई

2

मैं एक ArcGIS एड-इन के साथ काम कर रहा हूं। मेरे ऐड-इन में एक डॉकेबल विंडो और एक टूल कंट्रोल होता है। मैं अपने टूल की वजह से ArcGIS क्रैश का लॉग रखने की कोशिश कर रहा हूं। और मुझे Application.ThreadException का उपयोग करके शीर्ष-स्तरीय अपवाद हैंडलिंग पर कुछ सफलता मिलती है। चूंकि थ्रेड अपवाद केवल थ्रेड थ्रेड के लिए काम करता है, डॉकेबल विंडो को इंस्टेंट करने के बाद, कोई भी अपवाद जो आर्कगिस को क्रैश करने का कारण हो सकता है, वह इसे पकड़ लेता है, लेकिन यह डॉकेबल विंडो को इंस्टेंट करने से पहले काम नहीं करता है।

    public class AddinImpl : ESRI.ArcGIS.Desktop.AddIns.DockableWindow
    {
        private WatershedDelineationDockableWindow m_windowUI;

        public WatershedDelineationDockableWindow GetUI
        {
            get
            {
                return m_windowUI;
            }
        }

        public AddinImpl()
        {
            Application.ThreadException += MYThreadHandler;
            Log.Info("Creating dockable window.");
        }

        static void MYThreadHandler(object sender, ThreadExceptionEventArgs e)
        {
            Log.Error("unhandled error in thread " + e.Exception.ToString());
            MessageBox.Show("unhandled error in thread " + e.Exception.ToString());
        }

        protected override IntPtr OnCreateChild()
        {
            m_windowUI = new WatershedDelineationDockableWindow(this.Hook);
            return m_windowUI.Handle;
        }

        protected override void Dispose(bool disposing)
        {
            if (m_windowUI != null)
                m_windowUI.Dispose(disposing);

            base.Dispose(disposing);
            Log.Info("Closing dockable window ");
        }
    }

यह UI को इंस्टेंट करने के बाद शीर्ष-स्तरीय अपवाद हैंडलिंग करता है


दिलचस्प है, अपने निष्कर्षों को पोस्ट करने के लिए धन्यवाद। मुझे इसके साथ खेलना होगा। विशेष रूप से, मुझे आश्चर्य है कि क्या डॉक करने योग्य विंडो वास्तव में आवश्यक है या यदि इसे विस्तार में स्थापित किया जा सकता है।
blah238

@ blah238 Thread.Exception तब भी काम करता है जब मैं इसे बटन की ऑनक्लिक विधि पर रखता हूँ। मुझे लगता है कि यह यूआई के साथ बातचीत करने वाले किसी भी नियंत्रण के लिए काम करता है।
ईएमआई
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.