Это становится очень раздражающим. Прямо сейчас у меня есть приложение winforms, и все не работает должным образом, но, насколько я могу судить, исключений не было. Оказавшись почти во всех частях соответствующего кода, оказалось, что в начале моего приложения было сгенерировано исключение.
Короче говоря, в WinForms, будучи таким же крутым, как и в случае возникновения исключения, библиотека WinForms игнорирует его. Сообщение JIT «необработанное исключение произошло» не выдается, оно просто прекращает обработку текущего события и возвращается в графический интерфейс.
Это вызывает случайные ошибки, потому что код для загрузки данных не вызывается из-за исключительной ситуации, возникающей до загрузки этих данных.
Чтобы увидеть это в действии, я создал совершенно новое приложение WinForms и ввел следующий код:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
string blah = null;
blah.Trim();
}
}
Нажмите F5, и форма загрузится без каких-либо ошибок, даже если создается нулевая ссылка.
Затем я попытался перейти к своему Program.cs
методу main и добавить к нему Application.SetUnhandledExceptionMode(UnhandledExceptionMode.ThrowException);
. Тем не менее, моя форма загружается без каких-либо ошибок.
Несмотря на то, что я знаю, что могу сказать VS прервать во всех исключениях, я считаю эту ситуацию действительно плохой. Это вызывает действительно странные проблемы, которые трудно отладить в производственном процессе, и, поскольку это внутренний инструмент, я действительно хочу иметь его, чтобы он действительно выводил ошибки при возникновении исключения, а не игнорировал его молча.
Кто-нибудь знает, как это сделать?
Обновление: Просто чтобы обновить информацию, которую я узнал из комментариев.
Похоже, что это 64-битная проблема с Windows, как я узнал из этого вопроса , который я не видел до публикации. В этом вопросе он указал на сообщение об ошибке Microsoft об этом, в котором было сказано:
Здравствуйте,
Эта ошибка была закрыта как «Внешняя», потому что это поведение связано с тем, как x64-версия Windows обрабатывает исключения. Когда исключение пользовательского режима пересекает переход ядра, 64-разрядные версии Windows не позволяют распространению исключения. Поэтому подключенные отладчики не знают о том, что произошло исключение, в результате чего отладчик не смог сломать необработанное исключение.
К сожалению, когда команда Visual Studo ничего не может сделать для решения этой проблемы, это результат проектирования операционной системы. Все отзывы по этой проблеме следует адресовать команде Windows; однако команда Windows считает это «правильным» дизайном операционной системы и считает поведение x86 «неправильным».
С наилучшими пожеланиями,
Visual Studio Debugger
При этом сборки, не запускаемые через Visual Studio (или использующие Ctrl + F5 для запуска), по-видимому, показывают окно сообщения об исключении JIT EXCEPT , если в вашем Program.cs
есть следующий код:
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.ThrowException);
Этот код заставит Windows игнорировать исключение.
Однако, если вы (вместо этого) подпишетесь на событие Application.ThreadException
, не только ваши исключения будут обнаружены, но отладчик Visual Studio будет прерывать необработанные исключения!