Это не так, и это по замыслу. Не пытайтесь / ловите вокруг Application.Run ().
ваш обработчик событий Form_Leave также должен иметь такое же поведение.
Когда вы запускаете вашу программу с Application.Run()
, она запускает l oop и создает ThreadContext и ApplicationContext.
Сообщение l oop обрабатывает оконные сообщения, отправляемые в активную форму (скажем, нажатие клавиши Tab при управлении цифрой c) и выполняет необходимые действия.
Это то, что обрабатывает исключение при первом получении:
internal void UpdateFocusedControl() in ContainerControl:
try {
leaveControl.NotifyLeave();
}
catch (Exception e) {
Application.OnThreadException(e);
}
Теперь OnThreadException вызывает ваш Application_ThreadException
.
Давайте попробуем бросить снова здесь.
private static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e)
{
MessageBox.Show("Exception Handled");
throw e.Exception;
}
В следующий раз исключение обрабатывается ThreadContext
internal bool PreTranslateMessage(ref NativeMethods.MSG msg) in Application+ThreadContext
try
{
// Message processing, like leave control and focus next and call event handlers
}
catch (Exception e)
{
OnThreadException(e);
}
И, наконец, когда вы перебрасываете, на этот раз ваш оператор catch активируется.
Надеюсь, это прояснит ситуацию на вашей стороне.