Исключение в событии OnIdle не всплывает - PullRequest
4 голосов
/ 20 мая 2010

В основной форме я подписался на два события: Application.ThreadException и Application.Idle.Теоретически, любое исключение, которое не было поймано, должно доходить до основной формы.Однако это не работает, если исключение происходит в событии OnIdle.Система просто падает.кто-нибудь знает, как решить эту проблему?Спасибо.

Ответы [ 2 ]

3 голосов
/ 20 мая 2010

Я согласен, что не очень логично не получать событие ThreadException. Однако он работает таким образом, исключение ThreadException вызывается только тогда, когда цикл обработки сообщений отправляет событие, и в обработчике событий есть необработанное исключение. Событие Idle возникает, когда больше нет сообщения для отправки, оно следует совершенно другому пути кода.

Вы можете обойти это, перехватывая исключения в вашем обработчике события Idle:

    void Application_Idle(object sender, EventArgs e) {
        try {
            // Do stuff
        }
        catch (Exception ex) {
            Application.OnThreadException(ex);
        }
    }

Остерегайтесь того, что ThreadException является довольно смешанным благословением, если вы позволяете пользователю решать, выйти из программы или продолжить ее. Также обратите внимание, что он недостаточно универсален для перехвата всех исключений в вашей программе, вам все еще нужно исключение AppDomain.CurrentDomain.UnhandledException для обработки исключений, возникающих в потоках, отличных от потока пользовательского интерфейса, или исключений, которые возникают перед цикл сообщений начинает работать.

Если вы делаете это, чтобы убедиться, что пользователь может , а не , нажмите «Продолжить», а затем просто используйте Application.SetUnhandledExceptionMode (), чтобы полностью отключить событие ThreadException. Теперь все проходит через AppDomain.UnhandledException. Это лучший способ.

0 голосов
/ 20 мая 2010

Исключения только заполняют стек вызываемых методов.

Событие Idle не вызывается из кода вашей формы и, следовательно, не будет пузыриться ни с одним из ваших кодов.

Вместо этого вам придется ловить необработанные исключения.

Взгляните на:

  1. Application.ThreadException
  2. AppDomain.UnhandledException

Один из них поймает в ловушку ваше исключение.

...