Это становится очень раздражает. Сейчас у меня есть WinForms приложения, и вещи не работали хорошо, но без исключения были брошены насколько я мог сказать. После перебора почти всех частей соответствующих код, получается, что исключение быть брошенным на старте моего приложения.
Короче говоря, в WinForms, как удивительным, как это, если исключение возникает обязанности и достижения библиотеке игнорирует его. Нет "необработанное исключение" и Джит сообщение выдается, просто прекращает обработку текущего события и возвращается к GUI.
Это является причиной случайных ошибок, т. к. код для загрузки данных, это'Т называют из-за происходящих до этого загружаемых данных.
Чтобы увидеть это в действии, я создал абсолютно нового приложения приложения WinForms, и ввел следующий код:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
string blah = null;
blah.Trim();
}
}
Нажмите клавишу F5 и форма загружается без каких-либо ошибок показывает, даже если пустая ссылка исключение.
Тогда я попытался пойти к моей программе.основной метод CSи добавить
приложение.SetUnhandledExceptionMode(UnhandledExceptionMode.Значение throwexception);` к нему. До сих пор моя форма загружается, не вызывая никакой ошибки быть брошенным.
Хотя я знаю, что я могу сказать против, чтобы перерыв на все исключения, я нахожу эту ситуацию очень плохо. Это вызывает очень странные вопросы, которые трудно отлаживать в производство, и как это внутренний инструмент, который я действительно хочу так это на самом деле ошибки, когда возникает исключение, а не молча игнорирует его.
Кто-нибудь знает, как это сделать?
<ч> <б>обновления:</б> только для обновления на вещи, которые я узнал из комментариев.
Это, кажется, 64-разрядный выпуск с Windows, как я узнал из <а href="https://stackoverflow.com/questions/4933958/vs2010-does-not-show-unhandled-exception-message-in-a-64-bit-winforms-application">этот вопрос</а> что я не видел перед отправкой. В этот вопрос он указал на <а href="https://connect.microsoft.com/VisualStudio/feedback/details/357311/silent-exceptions-on-x64-development-machines">отчет Microsoft ошибка</а> об этом, что было это, чтобы сказать:
Привет,
этот баг был закрыт как "внешних" и потому что такое поведение приводит от того, как 64-разрядной версии Windows обрабатывать исключения. Когда исключение режима пользователя пересекает переход ядра, 64-разрядные версии Windows не позволяют исключение для распространения. Поэтому присоединенный отладчики не знают о том, что исключение произошло в результате отладчик не сумев пробить на необработанное исключение.
к сожалению, где нет ничего, что команды Visual Studo могу сделать, чтобы решить этот вопрос, он является результатом разработки операционной системы. Все отзывы по этому вопросу следует обращаться к рабочей группе Windows; однако команда Windows считает, что это в "правильном" в разработке операционной системы, и считает поведение x86, чтобы быть "неправильные" по.
С уважением, в Visual Studio отладчик
Это, как говорится, строит не работать через Visual Studio (или с помощью ctrl+f5, чтобы запустить), кажется, чтобы показать на окно JIT-компилятором сообщение об исключении только если у вас есть следующий код в программу ваш.на CS`:
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.ThrowException);
Что код Windows будет игнорировать исключение.
Однако, если вы (вместо) подписаться на приложение.Событие threadexceptionметод` не только исключений быть пойманным, визуальные студии'ы отладчика будет перерыв на необработанных исключений!
В вашей программе.компания CS' основные функции вы должны также гарантировать, что вы'вэ завернутые вашего звонка, чтобы открыть форму в попробовать/поймать. Кроме того, использовать домен приложения.События unhandledexception для перехвата исключений. Мы также добавить приложение.Threadexceptionметод тоже.
Я верю, что следующий даст вам крючки на все исключения, которые могут быть брошены...
static void Main()
{
try
{
System.Windows.Forms.Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
System.Windows.Forms.Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(OnGuiUnhandedException);
AppDomain.CurrentDomain.UnhandledException += OnUnhandledException;
var form = new MainForm();
form.ShowDialog();
}
catch (Exception e)
{
HandleUnhandledException(e);
}
finally
{
// Do stuff
}
}
private static void HandleUnhandledException(Object o)
{
// TODO: Log it!
Exception e = o as Exception;
if (e != null)
{
}
}
private static void OnUnhandledException(Object sender, UnhandledExceptionEventArgs e)
{
HandleUnhandledException(e.ExceptionObject);
}
private static void OnGuiUnhandedException(object sender, System.Threading.ThreadExceptionEventArgs e)
{
HandleUnhandledException(e.Exception);
}
Попробуйте выполнить следующие действия.
Это фрагмент кода:
[STAThread]
public static void Main(string[] args)
{
try
{
Application.ThreadException += new ThreadExceptionEventHandler(Application_ThreadException);
//your program entry point
}
catch (Exception ex)
{
//manage also these exceptions
}
}
private void Application_ThreadException(object sender, ThreadExceptionEventArgs e)
{
ProcessException(e.Exception);
}
Легко исправить это, чтобы не запустить под отладчиком.
Отладчик является маскировка исключение по некоторым причинам. Если вы запустите приложение нормально (сочетание клавиш Ctrl+клавишу F5), вы'll получают обычно на "необработанное исключение в приложении... продолжить или бросить?" и диалог.
Испытав это часто и определили проблему в отношении 64-разрядной операционной системы и форме.Событие load, я всегда стараюсь делать все мои запуск функции в форме.Показано событие. Для всех практических целей это то же самое (за исключением нескольких редких, исключительных обстоятельств), и JIT-компилятором сообщения производится в указанном случае.