Почему загрузка формы не может устранить исключение?

Это ошибка в Winforms? (протестирован как на VS2008, так и на VS2010)

private void Form1_Load(object sender, EventArgs e) { throw new Exception("Hey"); } 

Я не получаю никаких ошибок в этом коде, некоторое время назад я пытаюсь сформулировать решение для этого вопроса. Разберите число из строки с не цифрами между

И я делаю этот код в Form1_Load:

 private void Form1_Load(object sender, EventArgs e) { MessageBox.Show("X"); string s = "12ACD"; string t = s.ToCharArray().TakeWhile(c => char.IsDigit(c)).ToArray().ToString(); MessageBox.Show("Y"); int n = int.Parse(t); MessageBox.Show(n.ToString()); } 

Интересно, почему он не показал номер. Затем при перемещении кода в button1_Click …

 private void button1_Click(object sender, EventArgs e) { MessageBox.Show("X"); string s = "12ACD"; string t = s.ToCharArray().TakeWhile(c => char.IsDigit(c)).ToArray().ToString(); MessageBox.Show("Y"); int n = int.Parse(t); MessageBox.Show(n.ToString()); } 

… тогда я заметил, что есть ошибка: строка ввода не была в правильном формате.

Почему Form1_Load не вызвал каких-либо исключений, почему он молча провалился? Код просто выходит из формы1_load в строке t = s.ToCharArray (). TakeWhile …

Перепишите, я с тех пор понял, откуда он. Ошибка Windows при возникновении исключения в 32-разрядном процессе при работе в 64-разрядной версии Windows 7. Она проглатывает любое исключение, вызванное кодом, который запускается в ответ на сообщение Windows, которое запускается 64-разрядным менеджером Windows , Как WM_SHOWWINDOW, сообщение, которое вызывает событие Load, будет поднято.

Отладчик играет роль, потому что когда он активен, обычное исключение в приложении Winforms отключается, чтобы позволить отладчику останавливаться на исключении. Этого не происходит в этом сценарии, потому что Windows 7 сначала проглатывает исключение, не позволяя отладчику видеть его.

Я написал об этой проблеме более подробно в этом ответе , наряду с возможными обходными решениями.

См. Так: Случай исчезновения исключения OnLoad . Это по-дизайн (хотя и крайне глупый дизайн, ИМО). Ваше исключение попадает на границу режима ядра во время разматывания стека. Если вы можете, переключитесь на какое-то другое событие или не разрешите исключения; это не поможет, если вы ожидаете, что ваш отладчик автоматически отключит исключение без обработки в OnLoad.

Если вам все равно, я написал немного больше в этом ответе .

Классы classов WinForms автоматически не поймают никаких исключений для вас. Это не ошибка, это по дизайну – что бы они сделали с исключением?

Вы должны иметь свой собственный блок try / catch в любом случае или, в качестве альтернативы, обрабатывать событие Application.ThreadException . Это событие может быть полезно для некоторого общего кода обработки, такого как ведение журнала исключения или отображение диалогового windows с ошибкой, но, очевидно, оно не может сделать ничего конкретного для какого-либо отдельного события или типа исключения.

  • Что такое проверенные исключения в Java / C #?
  • Как заставить WinForms молча игнорировать необработанные исключения?
  • В чем разница между ошибками и исключениями?
  • Как использовать try catch для обработки исключений - лучшая практика
  • Исключение SQLite: SQLite Занято
  • избегая ненужных ссылок
  • Почему я не должен обертывать каждый блок в «try» - «catch»?
  • Почему Catch (Exception) почти всегда является плохой идеей?
  • Неподтвержденное исключение Java
  • Разница между C ++ 03 throw () specifier C ++ 11 noexcept
  • Eclipse - java.lang.ClassNotFoundException
  • Давайте будем гением компьютера.