private void button1_Click(object sender, EventArgs e)
{
ThrowException();
}
private void button2_Click(object sender, EventArgs e)
{
Thread t = new Thread(ThrowException);
t.Start();
}
private void button3_Click(object sender, EventArgs e)
{
(new VoidHandler(ThrowException)).BeginInvoke(null, null);
}
private void ThrowException()
{
throw new Exception("Test");
}
Еще unhandled exceptions
Когда приложение Windows-Application было однопоточным (хотя в .NET это заведомо не так, назовем его условно таким, думаю, понимаете, о чем я), обработка неперехваченных исключений была легка и приятна: Application.ThreadException, происходила сборка данных и формировался отчет, юзер жал кнопку "Продолжить" и всё было замечательно.
Но по разным причинам в приложении появилась многопоточность. И теперь необработанное исключение из потока не перехватывается Application.ThreadException. Программа падает, и даже AppDomain.UnhandledException не в силах помочь — сохранить данные мы можем, но о кнопочке "Продолжить" можно забыть.
Теперь амбула.
Я накидал тестовое приложение из одной формы с тремя кнопками и следующими обработчиками.
Код:
- Кнопка 1 работает в "старом стиле": исключение перехватывается Application.ThreadException, формируется отчет о нем, работа продолжается
- При нажатии на кнопку 2 идет перехват AppDomain.UnhandledException, и приложение затем гарантированно выгружается.
Вопрос 1. Как перехватить исключение в этом случае без завершения работы приложения? - При нажатии на кнопку 3 исключение никем не перехватывается, работа идет дальше, будто бы его и не было.
Вопрос 2. Почему необработанное исключение прошло мимо всех в приложении и работа продолжилась как ни в чем не бывало?