Необработанная обработка исключений в C# - PullRequest
0 голосов
/ 23 января 2020

Я пытаюсь понять, как программа C# обрабатывает необработанное исключение.

Я делаю свое тестирование в проекте windows форм. Если ответ отличается в других типах проектов, пожалуйста, я знаю.

Я запускаю программу из файла .exe, а не из отладчика Visual Studio.

Код:

    public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    //timer1.Interval = 10000
    private void timer1_Tick(object sender, EventArgs e)
    {
        //throw new Exception(Thread.CurrentThread.ManagedThreadId.ToString() + " This is an exception");
    }
}
static class Program
{

    static Form1 newForm;

    static void Main()
    {
        Thread FormThread = new Thread(NewForm);
        FormThread.Start();

        Thread.Sleep(5000);

        //throw new Exception(Thread.CurrentThread.ManagedThreadId.ToString() + " This is an exception");
    }

    static void NewForm()
    {
        newForm = new Form1();
        Application.Run(newForm);
    }
}

У меня вопрос, что будет windows ответ на необработанное исключение в C# программе?

в приведенном выше примере:

Если исключение выдается из функции timer1_Tick (путем удаления префикса комментария), я получаю следующее сообщение: timer1_Tick Exception

Если исключение выдается из функции Main (путем удаления префикса комментария), я получаю следующее сообщение: Main Exception

почему я получаю 2 разных сообщения и как Windows / программа «выбирает», какое сообщение выдавать.

Спасибо.

1 Ответ

1 голос
/ 23 января 2020

В приложении WinForms обработчики событий вызываются WindowsFormsSynchronizationContext. Когда обработчик события генерирует необработанное исключение, контекст обрабатывает его, отображая первый диалог ошибки. В этот момент контекст синхронизации (который является просто насосом сообщений) все еще работает, и он может продолжать обрабатывать другие события, так что вам предоставляется выбор.

Метод Main, напротив, вызывается самой операционной системой, чтобы запустить приложение. Если там есть необработанное исключение, WIndows не имеет другого выбора, кроме как завершить приложение, и отображает второе диалоговое окно, информирующее вас об этом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...