ArcGIS 10アドイン:トップレベルの例外処理


10

私が取り組んでいるArcGIS 10アドインは非常にシンプルです。ツールコントロールとドッキング可能なウィンドウだけです。ソースで発生すると予想される特定の例外を処理し、他のすべてをスローしますが、アドインフレームワークでこれらの予期しない例外を処理するためのベストプラクティスは何ですか?

私は現在、を実行して、catch (System.Exception ex)それを処理できる上位レベルのメソッドを持たないすべてのメソッドのMessageBoxに表示していますが、これはベストプラクティスのようには見えません(もちろん、FxCopはひねりを加えています)それについて)。

ArcGIS 10アドインフレームワークには、最上位の例外ハンドラーをイベントApplication.ThreadExceptionAppDomain.UnhandledExceptionイベントなどに接続するための機能はありますか?

アドインは単なるクラスライブラリであり、基盤となるアプリケーションの起動コードにアクセスできないアプリケーション(私が収集したものから、これらのイベントは起動プロセスの非常に早い段階でフックする必要がある)ではないように見えるので、私の推測はそうではありませんが、アドインで「予期しない」例外を処理する方法について、専門家の意見があれば教えてください。


1
ちょうどFYI:ここにあるリンクこれは、ESRIで少しの固定を取得しようとしている
エリック・L

@ blah238問題を解決するために何をしましたか?処理できない例外を処理するための指針を教えていただけますか?
Emi

コードのすべてのエントリポイントに例外ハンドラを配置します。
blah238 2013年

すべてのエントリポイントで?!! トップレベルからそれを処理する他の方法はありませんか?
Emi

それが私の理解です、はい。これを改善したい場合は、上記の@baensリンクを参照してください。
blah238

回答:


7

私が知る限り、ESRIが現在ベストプラクティスとして提供しているエラー処理を実装しています。アプリケーション(ArcMap)の未処理の例外を取得すると、アドインの一部ではないエラーに関するメッセージが表示される可能性があります。作成するアドインのほとんどはおそらくボタンであり、ボタンには実際には予期しないエラーがキャッチされて表示される2つの主要なルート(onClickonUpdate)しかありません。

ただ、 'を使用することを忘れないで投げる代わりに「のスローEXを」。微妙な違いはありますが、呼び出された関数からエラーが発生するため、エラーの系統が保持されます。


おかげで、これはすべてのESRIサンプルが同じ方法で行うため、私がそうであると予想したことです。
blah238

@Troy Schmidtドッキング可能なウィンドウを使用しているときのポインタを教えてもらえますか、未処理の例外をどのように処理できますか?そして、どこから、そして何を「投げる」べきでしょうか?
Emi

2

ArcGISアドインを使用しています。私のアドインは、ドッキング可能なウィンドウとツールコントロールで構成されています。ツールが原因で、ArcGISのクラッシュのログを保持しようとしています。そして、Application.ThreadExceptionを使用して、トップレベルの例外処理でいくつかの成功を収めています。スレッド例外はUIスレッドでのみ機能するため、ドッキング可能なウィンドウをインスタンス化した後、ArcGISをクラッシュさせる原因となる可能性のある例外はすべてキャッチされますが、ドッキング可能なウィンドウをインスタンス化する前には機能しません。

    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 2013年

@ blah238 Thread.Exceptionは、ボタンのonclickメソッドに置いても機能します。UIとやり取りするすべてのコントロールで機能すると思います。
Emi
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.