Как я могу получить приложения WinForms молча перестать игнорировать необработанных исключений?

Это становится очень раздражает. Сейчас у меня есть 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метод` не только исключений быть пойманным, визуальные студии'ы отладчика будет перерыв на необработанных исключений!

Комментарии к вопросу (8)
Решение

В вашей программе.компания 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);
}
Комментарии (2)

Попробуйте выполнить следующие действия.

  • Обрабатывать исключения в основную точку входа приложения.
  • Кроме того, управлять необработанных исключений с помощью резьбы ThreadExceptionEventHandler

Это фрагмент кода:

[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);
}
Комментарии (2)

Легко исправить это, чтобы не запустить под отладчиком.

Отладчик является маскировка исключение по некоторым причинам. Если вы запустите приложение нормально (сочетание клавиш Ctrl+клавишу F5), вы'll получают обычно на "необработанное исключение в приложении... продолжить или бросить?" и диалог.

Комментарии (7)

Испытав это часто и определили проблему в отношении 64-разрядной операционной системы и форме.Событие load, я всегда стараюсь делать все мои запуск функции в форме.Показано событие. Для всех практических целей это то же самое (за исключением нескольких редких, исключительных обстоятельств), и JIT-компилятором сообщения производится в указанном случае.

Комментарии (0)