У меня есть этот код:
001 private void uiButton1_Click(object sender, EventArgs e)
002 {
003 string someString = "";
004 try
005 {
006 someString = ThisMethodThrowsAnException();
007 }
008 catch (Exception)
009 {
010 throw;
011 }
012 }
Код доходит до «броска» в улове, но стандартное диалоговое окно winforms «необработанное исключение» никогда не появляется.
ThisMethodThrowsAnException () вызывает исключение типа System.Exception. У меня есть событие, прикрепленное к Application.ThreadException. Это событие не ударил в этом случае. uiButton - это стандартная кнопка winforms. Я создал кнопку, которая генерирует исключение в своем обработчике событий, и это исключение является , перехваченным Application_ThreadException. Вся обработка происходит в одном потоке.
Для себя я не понимаю, почему этот код не привел бы к нормальному блоку исключений (который, поскольку это приложение, которое я использую только, является чем-то полезным). В этом приложении есть и другие места, где я видел стандартный диалог исключений.
У меня есть обработчик нажатия кнопки, который выглядит следующим образом:
private void button2_Click(object sender, EventArgs e)
{
throw new Exception("I are broke!");
}
И обработчик ThreadException, который выглядит следующим образом:
static void Application_ThreadException(object sender, ThreadExceptionEventArgs e)
{
MessageBox.Show("Exception: " + e.Exception.Message);
}
Я использую UnhandledExceptionMode.Automatic. Когда я нажимаю uiButton1, я не получаю сообщение об исключении через Application_ThreadException. Однако, если я добавлю новое исключение броска непосредственно перед вызовом метода для ThisMethodThrowsAnException, я получу MessageBox.
Я получаю MessageBox через button2 (через Application_ThreadException).
Итак, что-то происходит в ThisMethodThrowsAnException. Единственное, о чем я могу думать, - это запуск нового потока, но это не тот случай, когда я отлаживаю его.
Если исключение произошло в другом потоке, вернется ли оно к блоку catch в uiButton1_Click?