Componente aggiuntivo ArcGIS 10: gestione delle eccezioni di livello superiore


10

Il componente aggiuntivo ArcGIS 10 su cui sto lavorando è piuttosto semplice: solo un controllo degli strumenti e una finestra agganciabile. Sto gestendo le eccezioni specifiche che prevedo si verificano alla fonte e generano tutto il resto, ma qual è la migliore pratica per gestire quelle eccezioni impreviste nel framework del componente aggiuntivo?

Attualmente sto solo facendo un catch (System.Exception ex)e lo sto mostrando in un MessageBox in ogni metodo che non ha un metodo di livello superiore in cui potrei gestirlo, ma questa non sembra la migliore pratica (e, naturalmente, FxCop sta piagnucolando a proposito).

Esiste una struttura nel framework del componente aggiuntivo ArcGIS 10 per collegare un gestore di eccezioni di livello superiore, ad esempio agli eventi Application.ThreadExceptiono AppDomain.UnhandledException?

Considerando che i componenti aggiuntivi sono solo librerie di classi e non applicazioni che non hanno accesso al codice di avvio dell'applicazione sottostante (da quello che raccolgo, quegli eventi devono essere collegati molto presto nel processo di avvio), la mia ipotesi è no, ma ho pensato Chiederei se qualche esperto là fuori avesse qualche suggerimento su come gestire le eccezioni "impreviste" nei componenti aggiuntivi.


1
Cordiali saluti: ecco un link che cerca di risolvere un po 'il problema a esri
Erik L

@ blah238 Cosa hai fatto per risolvere il tuo problema? Potete per favore darmi alcuni suggerimenti per gestire le eccezioni non gestite?
Emi,

Inserisci un gestore eccezioni in ogni punto di accesso al tuo codice.
blah238,

Ad ogni punto di ingresso? !! Non c'è altro modo per gestirlo dal livello più alto?
Emi,

Questa è la mia comprensione, sì. Vedi il link @baens sopra se desideri vederlo migliorato.
blah238,

Risposte:


7

Per quanto ne so, stai implementando la gestione degli errori che ESRI sta attualmente pubblicando come best practice. Se dovessi afferrare le eccezioni non gestite dell'applicazione ( ArcMap ), potresti potenzialmente visualizzare messaggi sugli errori che non facevano parte del tuo componente aggiuntivo. La maggior parte degli AddIns che scrivi saranno probabilmente pulsanti e quelli hanno davvero solo due percorsi principali che gli errori imprevisti verrebbero rilevati e visualizzati ( onClick e onUpdate ).

Ricorda solo di usare ' lancia ' invece di ' lancia ex '. C'è una differenza minuta, ma si traduce nel mantenimento della discendenza dell'errore mentre bolle dalle funzioni chiamate.


Grazie, questo è quello che mi aspettavo, dato che tutti i campioni ESRI lo fanno allo stesso modo.
blah238,

@Troy Schmidt, per favore, puoi darmi un puntatore su quando sto usando una finestra agganciabile, come posso gestire le eccezioni non gestite? E da dove e cosa dovrei "lanciare"?
Emi,

2

Sto lavorando con un componente aggiuntivo ArcGIS. Il mio componente aggiuntivo consiste in una finestra agganciabile e un controllo degli strumenti. Sto cercando di tenere traccia del crash di ArcGIS a causa del mio strumento. E ottengo un certo successo nella gestione delle eccezioni di livello superiore utilizzando Application.ThreadException. Poiché l'eccezione del thread funziona solo per il thread dell'interfaccia utente, dopo aver creato un'istanza della finestra agganciabile, qualsiasi eccezione che può causare un arresto anomalo di ArcGIS, viene rilevata, ma non funziona prima dell'istanza della finestra agganciabile.

    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 ");
        }
    }

In questo modo viene gestita l'eccezione di livello superiore dopo aver istanziato l'interfaccia utente


Interessante, grazie per aver pubblicato i tuoi risultati. Dovrò giocare con questo. In particolare, mi chiedo se la finestra agganciabile sia davvero necessaria o se possa essere impostata in un'estensione.
blah238,

@ blah238 Thread.Exception funziona anche quando lo metto sul metodo onclick del pulsante. Penso che funzioni per qualsiasi controllo che interagisce con l'interfaccia utente.
Emi,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.