Почему событие Form_Load уже перехватывает все исключения? - PullRequest
4 голосов
/ 28 сентября 2011

Я поместил свой код инициализации при загрузке формы, так как не рекомендуется оставлять его в конструкторе, потому что дизайнер может аварийно завершить работу.

Проблема в том, что я только что понял, что любое исключение внутри события загрузки формы будет перехвачено внутри !

Почему? Как мне это преодолеть?

    private void Form1_Load(object sender, EventArgs e)
    {
        //This exception will be catch internally (I don't know why and where)
        throw new Exception("test");
    }

1 Ответ

2 голосов
/ 28 сентября 2011

Это ошибка и объясняется здесь:

Случай исчезновения исключения OnLoad - исключения обратного вызова пользовательского режима в x64

http://blog.paulbetts.org/index.php/2010/07/20/the-case-of-the-disappearing-onload-exception-user-mode-callback-exceptions-in-x64/

VS ответ команды: Отсюда: https://connect.microsoft.com/VisualStudio/feedback/details/357311/silent-exceptions-on-x64-development-machines

Опубликовано Microsoft @ 22.04.2010 17:12 Здравствуйте,

Эта ошибка была закрыта как «Внешняя», потому что это поведение связано с тем, как x64-версия Windows обрабатывает исключения. Когда исключение пользовательского режима пересекает переход ядра, 64-разрядные версии Windows не позволяют распространению исключения. Поэтому подключенные отладчики не знают о том, что возникла исключительная ситуация, в результате которой отладчику не удалось сломать необработанное исключение.

К сожалению, когда команда Visual Studio ничего не может сделать для решения этой проблемы, это результат проектирования операционной системы. Все отзывы по этой проблеме следует адресовать команде Windows; однако команда Windows считает это «правильным» дизайном операционной системы и считает поведение x86 «неправильным».

С наилучшими пожеланиями, Visual Studio Debugger


Решение, которое я использую: Я поместил код, который был внутри загрузки формы в конструктор, и я проверяю, запущено ли приложение в конструкторе или нет

    protected static bool IsInDesigner
    {
        get { return (Assembly.GetEntryAssembly() == null); }
    }

     if (!MainForm.IsInDesigner)
          LoadControl();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...