Тихие сбои в С#, казалось бы, необработанные исключения, которые не приводят к сбою программы
В приложении winforms в форме Load event добавьте следующую строку:
throw new Exception();
и запустите приложение. Это бежало без проблем. Это называется тихим сбоем, вы можете попытаться добавить сообщения до и после, и вы скоро узнаете, что вместо сбоя приложения оператор throw просто выходит из события Load.
Я уверен, что нет необходимости объяснять, насколько это уродливо и опасно.
Мне было интересно, тем не менее, в (возможно, истории) причинах этого ужасающего поведения.
Я уверен, что это не дизайнерское решение, возможно, не выбор, или лень. Кто-нибудь знает?
Был бы рад, если кто-нибудь может указать мне на список событий, которые могут также вызвать сбои.
Вот фрагмент моего кода - я понятия не имею, как это может помочь, но вот оно:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Form f = new Form();
f.Load += new EventHandler((x, y) => { throw new Exception(); });
Application.Run(f);
}
}
}
ИЗМЕНИТЬ
Кажется, это не происходит со всеми.
Я использую: fw 3.5, winforms, vs 2008, vista x64, новый чистый проект winforms, с указанным выше кодом.
Ответы
Ответ 1
Это известная проблема в системах x64:
Это известная проблема в 64-разрядной ОС Платформа. Причина в том, что 64-битный Ядро ОС не разрешает режим пользователя исключение через стек ядра. Исключение проглатывается ОС sliently. Это происходит в FormLoad обработчик, потому что он вызывается в ОС Перезвони. OS 32bits не делает этого, поэтому он не воспроизводится там.
Команда ОС расследует связанные вопросы. В то же время у вас есть для решения этой проблемы. Включение "Прекратить первое исключение случайности" будет заставить отладчик остановиться в этом сценарий. Но это делает отладчик, чтобы остановить очень часто, так что вы может захотеть сделать это, только когда вы найти проблему.
Связанный отчет об ошибке был последний раз обновлен в феврале 2008 года и не указывает, что произошло с тех пор.
Я могу воспроизвести большинство постов на моей 32-битной системе здесь, и я могу воспроизвести поведение OP на моем 64-разрядном (Vista SP2, 3.5SP1 Framework) рабочем ПК.