Додаток ArcGIS 10: обробка виключень верхнього рівня


10

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

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

Чи є в додатку для ArcGIS 10 додаткове обладнання для обробника винятків вищого рівня, наприклад, до Application.ThreadExceptionабо AppDomain.UnhandledExceptionподій?

Я вважаю, що надбудови - це просто бібліотеки класів, а не додатки, що не мають доступу до основного коду запуску програми (з того, що я збираю, ці події повинні бути підключені дуже рано в процесі запуску), я думаю, ні, але я подумав Я б запитав, чи є якісь там експерти, якісь пропозиції щодо того, як слід працювати з "несподіваними" винятками у додатках.


1
Просто FYI: ось посилання, що намагається трохи виправити це на esri
Ерік Л

@ blah238 Що ти зробив для вирішення своєї проблеми? Чи можете ви, будь ласка, дати мені кілька покажчиків на обробку виправлених винятків?
Емі

Поставте обробник винятків у кожній точці входу вашого коду.
blah238

У кожному пункті входу? !! Немає іншого способу впоратися з цим з найвищого рівня?
Емі

Це моє розуміння, так. Перегляньте посилання @baens вище, якщо ви хочете, щоб це було покращено.
blah238

Відповіді:


7

Наскільки я можу вам сказати, ви реалізуєте обробку помилок, які ESRI наразі застосовує як найкращу практику. Якби ви захопили невпорядковані винятки програми ( ArcMap ), ви потенційно могли б відображати повідомлення про помилки, які не входили в ваш AddIn. Більшість доданків, які ви пишете, ймовірно, будуть кнопками, і в них дійсно є лише два основні маршрути, за якими несподівані помилки можуть бути виявлені та відображені ( onClick та onUpdate ).

Просто пам’ятайте, щоб використовувати « кинути » замість « кинути колишній ». Різниця в хвилині є, але це призводить до збереження лінії помилки, оскільки вона переливається від викликаних функцій.


Дякую, саме так я очікував, тому що всі зразки ESRI роблять це однаково.
blah238

@Troy Schmidt Чи можете ви, будь ласка, дати мені вказівку про те, коли я використовую доклейне вікно, як я можу обробляти необроблені винятки? І звідки і що я повинен «кинути»?
Емі

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

Це робить обробку винятків вищого рівня після інстанціювання інтерфейсу користувача


Цікаво, дякую за публікацію ваших висновків. Мені доведеться пограти з цим. Зокрема, мені цікаво, чи дійсно потрібне вікно для стиковки чи його можна встановити у розширенні.
blah238

@ blah238 Thread.Exception також працює, коли я ставлю його на метод onclick кнопки. Я думаю, що це працює для будь-якого контролю, який взаємодіє з інтерфейсом користувача.
Емі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.