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

Является ли это ошибкой в ​​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...

Ответы

Ответ 1

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

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

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

Ответ 2

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

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

Ответ 3

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

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