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

Это ошибка в 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 с ошибкой, но, очевидно, оно не может сделать ничего конкретного для какого-либо отдельного события или типа исключения.

  • Что я должен знать о Structured Exceptions (SEH) в C ++?
  • Должен ли я получать пользовательские исключения из Exception или ApplicationException в .NET?
  • При построении конструктора по умолчанию невозможно обработать исключение: type Exception, созданный неявным супер-конструктором
  • Будут ли исключения C ++ безопасно распространяться через C-код?
  • избегая ненужных ссылок
  • Регистрация активности пользователя, телеметрия (и переменные в глобальных обработчиках исключений)
  • Исключение исключений в Java без потери трассировки стека
  • Что означает «фатальная ошибка: неожиданно найденная нуль при разворачивании необязательного значения»?
  • Насколько медленны исключения .NET?
  • Почему TargetInvocationException рассматривается как неотображаемое средой IDE?
  • Почему существует NotImplementedException?
  • Давайте будем гением компьютера.