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