Исключение в событии OnIdle не всплывает

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

2 ответа

Решение

Я согласен, что не очень логично не получать событие 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. Это лучший способ.

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

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

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

Взгляни на:

  1. Application.ThreadException
  2. AppDomain.UnhandledException

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

Другие вопросы по тегам