Надстройка ArcGIS 10: обработка исключений верхнего уровня

10

Надстройка ArcGIS 10, над которой я работаю, довольно проста - всего лишь элемент управления инструментом и закрепляемое окно. Я обрабатываю конкретные исключения, которые, как я ожидаю, возникает в исходном коде и выбрасывает все остальное, но как лучше всего обрабатывать эти неожиданные исключения в структуре надстроек?

В настоящее время я просто делаю catch (System.Exception ex)и показываю его в MessageBox в каждом методе, у которого нет метода более высокого уровня, с которым я мог бы справиться, но это не кажется лучшей практикой (и, конечно, FxCop скулил об этом).

Есть ли какая-либо возможность в структуре надстроек ArcGIS 10 для подключения обработчика исключений верхнего уровня, например, к событиям Application.ThreadExceptionили AppDomain.UnhandledException?

Видя, что надстройки - это просто библиотеки классов, а не приложения, не имеющие доступа к коду запуска базового приложения (из того, что я понял, эти события нужно подключать очень рано в процессе запуска), я думаю, что нет, но я подумал Я бы спросил, есть ли у экспертов какие-либо предложения о том, как «неожиданные» исключения должны обрабатываться в надстройках.

blah238
источник
1
Просто к сведению: вот ссылка, пытающаяся немного исправить это в esri
Эрик Л
@ blah238 Что ты сделал, чтобы решить свою проблему? Не могли бы вы дать мне несколько советов по обработке необработанных исключений?
Эми
Поместите обработчик исключений в каждую точку входа в ваш код.
blah238
На каждой точке входа? !! Нет другого способа справиться с этим с верхнего уровня?
Эми
Это мое понимание, да. Посмотрите ссылку @baens выше, если вы хотите, чтобы это улучшилось.
blah238

Ответы:

7

Насколько я могу судить, вы реализуете обработку ошибок, которую ESRI в настоящее время использует в качестве передового опыта. Если бы вы ухватились за необработанные исключения приложения ( ArcMap ), вы могли бы потенциально отображать сообщения об ошибках, которые не были частью вашего AddIn. Большинство надстроек вы пишете, вероятно , будет кнопка и те , действительно есть только два основных путь , что неожиданные ошибки будут пойманы и отображаются ( OnClick и OnUpdate ).

Просто не забудьте использовать « throw » вместо « throw ex ». Существует небольшая разница, но она приводит к сохранению происхождения ошибки, поскольку она всплывает из вызываемых функций.

Трой Шмидт
источник
Спасибо, это то, что я ожидал, так как все образцы ESRI делают это одинаково.
blah238
@ Трой Шмидт, можете ли вы дать мне указатель о том, когда я использую закрепляемое окно, как я могу обрабатывать необработанные исключения? И откуда и что я должен "бросить"?
Эми
2

Я работаю с надстройкой ArcGIS. Моя надстройка состоит из закрепляемого окна и инструмента управления. Я пытаюсь вести журнал сбоя ArcGIS из-за моего инструмента. И я добился некоторого успеха при обработке исключений верхнего уровня с помощью Application.ThreadException. Поскольку исключение потока работает только для потока пользовательского интерфейса, после создания экземпляра закрепляемого окна, любое исключение, которое может стать причиной сбоя 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 ");
        }
    }

Это делает обработку исключений верхнего уровня после создания пользовательского интерфейса

Emi
источник
Интересно, спасибо за публикацию ваших результатов. Я должен поиграть с этим. В частности, мне интересно, действительно ли стыкуемое окно действительно необходимо или его можно настроить в расширении.
blah238
@ blah238 Thread.Exception также работает, когда я помещаю его в метод onclick кнопки. Я думаю, что это работает для любого элемента управления, который взаимодействует с пользовательским интерфейсом.
Эми