Почему загрузка формы не может поймать исключение? - PullRequest
15 голосов
/ 09 июля 2010

Это ошибка в 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 не уловил ни одного исключения, почему он молча провалился? Код просто выходит из form1_load в string t = s.ToCharArray (). TakeWhile ...

Ответы [ 3 ]

21 голосов
/ 09 июля 2010

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

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

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

5 голосов
/ 09 декабря 2010

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

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

0 голосов
/ 09 июля 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...