ArcGIS 10加载项:顶级异常处理


10

我正在使用的ArcGIS 10插件非常简单-只是一个工具控件和一个可停靠窗口。我正在处理预计会在源头发生的特定异常,并抛出其他所有异常,但是在外接程序框架中处理那些意外异常的最佳实践是什么?

我目前只是在做一个catch (System.Exception ex),并在没有可用我可以处理的更高级方法的每个方法中将其显示在MessageBox中,但这似乎不是最佳实践(当然,FxCop在抱怨关于它)。

ArcGIS 10附加框架中是否有任何功能可用于关联顶级异常处理程序,例如Application.ThreadExceptionAppDomain.UnhandledException事件?

看到加载项只是类库,而不是无法访问基础应用程序的启动代码的应用程序(从我的收集中,这些事件必须在启动过程的早期就进行挂钩),我的猜测不是,但我认为我想问一下是否有任何专家对外接程序中应如何处理“意外”异常有任何建议。


1
仅供参考:这是一个尝试在esri上解决此问题的链接
Erik L

@ blah238您做了什么来解决您的问题?您能给我一些处理未处理异常的指针吗?
艾米(Emi)2013年

在代码的每个入口处都放置一个异常处理程序。
blah238 2013年

在每个入口点?!没有其他方法可以从顶层处理它?
艾米(Emi)2013年

这是我的理解,是的。如果您希望看到此改进,请参见上面的@baens链接。
blah238 2013年

Answers:


7

据我所知,您正在实施ESRI当前作为最佳实践进行的错误处理。如果要抓住应用程序(ArcMap)未处理的异常,则可能会显示有关错误的消息,这些错误不属于AddIn。您编写的大多数AddIn可能都是按钮,而实际上它们只有两条主要路径,即会捕获并显示意外错误(onClickonUpdate)。

只需记住使用“ throw ”而不是“ throw ex ”即可。两者之间有微小的差异,但是当错误从被调用的函数冒出来时,它会保留错误的沿袭。


谢谢,这是我所希望的情况,因为所有ESRI样本都以相同的方式进行操作。
blah238

@Troy Schmidt,能否请您给我一个有关我在使用可停靠窗口时的指示,我该如何处理未处理的异常?我应该从哪里和什么“扔”?
艾米(Emi)2013年

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年

当我将它放在按钮的onclick方法上时,@ blah238 Thread.Exception也可以工作。我认为它适用于与UI交互的任何控件。
艾米(Emi)2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.