Рассмотрим следующее простое приложение: форму окна, созданную последовательностью «новое приложение C # windows» в VS, которая была изменена следующим образом:
public static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
try
{
Application.Run(new Form1());
}
catch (Exception ex)
{
MessageBox.Show("An unexpected exception was caught.");
}
}
Form1.cs содержит следующие модификации:
private void Form1_Load(object sender, EventArgs e)
{
throw new Exception("Error");
}
Если я нажимаю F5 в IDE, то, как и ожидалось, я вижу окно с сообщением о том, что возникла исключительная ситуация, и приложение закрывается.
Если я захожу в Debug (или Release) / bin и запускаю исполняемый файл, я вижу стандартное окно «Необработанное исключение», означающее, что мой обработчик исключений не работает.
Очевидно, что это связано с тем, что исключение выдается из другого потока, из которого вызывается Application.Run. Но остается вопрос - почему поведение отличается в зависимости от того, было ли приложение запущено из IDE или из командной строки?
Какова наилучшая практика, позволяющая гарантировать, что никакие исключения не останутся необработанными в приложении?