Подтвердить что ты не робот

Тихие сбои в С#, казалось бы, необработанные исключения, которые не приводят к сбою программы

В приложении 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, с указанным выше кодом.

4b9b3361

Ответ 1

Это известная проблема в системах x64:

Это известная проблема в 64-разрядной ОС Платформа. Причина в том, что 64-битный Ядро ОС не разрешает режим пользователя исключение через стек ядра. Исключение проглатывается ОС sliently. Это происходит в FormLoad обработчик, потому что он вызывается в ОС Перезвони. OS 32bits не делает этого, поэтому он не воспроизводится там.

Команда ОС расследует связанные вопросы. В то же время у вас есть для решения этой проблемы. Включение "Прекратить первое исключение случайности" будет заставить отладчик остановиться в этом сценарий. Но это делает отладчик, чтобы остановить очень часто, так что вы может захотеть сделать это, только когда вы найти проблему.

Связанный отчет об ошибке был последний раз обновлен в феврале 2008 года и не указывает, что произошло с тех пор.

Я могу воспроизвести большинство постов на моей 32-битной системе здесь, и я могу воспроизвести поведение OP на моем 64-разрядном (Vista SP2, 3.5SP1 Framework) рабочем ПК.