ArcGIS 10-Add-In: Ausnahmebehandlung auf oberster Ebene

10

Das ArcGIS 10-Add-In, an dem ich arbeite, ist ziemlich einfach - nur ein Werkzeugsteuerelement und ein andockbares Fenster. Ich behandle die spezifischen Ausnahmen, von denen ich erwarte, dass sie an der Quelle auftreten, und wirf alles andere aus. Aber was ist die beste Vorgehensweise, um diese unerwarteten Ausnahmen im Add-In-Framework zu behandeln?

Ich mache gerade eine catch (System.Exception ex)und zeige sie in einer MessageBox in jeder Methode, die keine übergeordnete Methode hat, mit der ich umgehen könnte, aber dies scheint nicht die beste Vorgehensweise zu sein (und natürlich jammert FxCop darüber).

Gibt es im ArcGIS 10-Add-In-Framework eine Funktion, mit der ein Ausnahmebehandler der obersten Ebene verbunden werden kann, beispielsweise mit den Ereignissen Application.ThreadExceptionoder AppDomain.UnhandledException?

Da Add-Ins nur Klassenbibliotheken und keine Anwendungen ohne Zugriff auf den Startcode der zugrunde liegenden Anwendung sind (soweit ich weiß, müssen diese Ereignisse sehr früh im Startprozess verknüpft werden), ist meine Vermutung nein, aber ich dachte Ich würde fragen, ob Experten Vorschläge dazu haben, wie "unerwartete" Ausnahmen in Add-Ins behandelt werden sollen.

blah238
quelle
1
Nur zu Ihrer Information : Hier ist ein Link, der versucht, dies ein wenig bei esri zu beheben
Erik L
@ blah238 Was hast du getan, um dein Problem zu lösen? Können Sie mir bitte einige Hinweise geben, um nicht behandelte Ausnahmen zu behandeln?
Emi
Fügen Sie an jedem Einstiegspunkt in Ihren Code einen Ausnahmebehandler ein.
blah238
An jedem Einstiegspunkt? !! Es gibt keine andere Möglichkeit, von der obersten Ebene damit umzugehen?
Emi
Das ist mein Verständnis, ja. Siehe @baens Link oben, wenn Sie dies verbessert sehen möchten.
blah238

Antworten:

7

Soweit ich Ihnen sagen kann, implementieren Sie die Fehlerbehandlung, die ESRI derzeit als Best Practice veröffentlicht. Wenn Sie die nicht behandelten Ausnahmen der Anwendung ( ArcMap ) in den Griff bekommen, werden möglicherweise Meldungen zu Fehlern angezeigt, die nicht Teil Ihres AddIn waren. Die meisten der AddIns, die Sie schreiben, werden wahrscheinlich Schaltflächen sein, und diese haben wirklich nur zwei Hauptrouten, auf denen unerwartete Fehler abgefangen und angezeigt werden ( onClick und onUpdate ).

Denken Sie daran, den Wurf anstelle von Ex zu verwenden. Es gibt einen winzigen Unterschied, der jedoch dazu führt, dass die Fehlerlinie beibehalten wird, wenn sie aus aufgerufenen Funktionen sprudelt.

Troy Schmidt
quelle
Vielen Dank, das habe ich erwartet, da alle ESRI-Proben es auf die gleiche Weise tun.
blah238
@Troy Schmidt Kannst du mir bitte einen Hinweis geben, wann ich ein andockbares Fenster benutze? Wie kann ich mit nicht behandelten Ausnahmen umgehen? Und von wo und was soll ich "werfen"?
Emi
2

Ich arbeite mit einem ArcGIS-Add-In. Mein Add-In besteht aus einem andockbaren Fenster und einer Werkzeugsteuerung. Ich versuche aufgrund meines Tools, das Protokoll des ArcGIS-Absturzes zu führen. Und ich habe einige Erfolge bei der Ausnahmebehandlung auf oberster Ebene mit Application.ThreadException. Da die Thread-Ausnahme nur für UI-Threads funktioniert, wird nach dem Instanziieren des andockbaren Fensters jede Ausnahme, die zum Absturz von ArcGIS führen kann, abgefangen, funktioniert jedoch nicht, bevor das andockbare Fenster instanziiert wird.

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

Dies führt eine Ausnahmebehandlung der obersten Ebene durch, nachdem die Benutzeroberfläche instanziiert wurde

Emi
quelle
Interessant, danke für die Veröffentlichung Ihrer Ergebnisse. Ich muss damit herumspielen. Insbesondere frage ich mich, ob das andockbare Fenster wirklich notwendig ist oder ob es in einer Erweiterung eingerichtet werden könnte.
blah238
@ blah238 Thread.Exception funktioniert auch, wenn ich es auf die Onclick-Methode von button setze. Ich denke, es funktioniert für jedes Steuerelement, das mit der Benutzeroberfläche interagiert.
Emi