Я хочу узнать, как работает журнал событий Windows при сбое моего приложения, поэтому я добавил тестовую кнопку в throw new Exception()
.К моему удивлению, приложение просто продолжает работать.Windows отображает диалоговое окно с параметрами «Продолжить» или «Выход», и, нажав «Продолжить», приложение продолжает работать.Я ожидал, что приложение продолжит аварийное завершение после продолжения после необработанного исключения.
Большинство блогов по этой теме тестируются с небольшим консольным приложением, которое делит на ноль, но я думал, что это не добавляет особых проблем при созданиинебольшое приложение Forms вместо.В реальном мире мне нужно знать, как ведут себя мои приложения Forms.Вот код с двумя кнопками: одна для обновления отображения времени, чтобы доказать, что приложение действительно работает, а другая для создания необработанного исключения.
using System.Windows.Forms;
namespace WindowsFormsApp1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
label_Msg.Text = DateTime.Now.ToString();
}
private void button_CrashNow_Click(object sender, EventArgs e)
{
throw new DivideByZeroException("This is Sandbox Crash Test");
label_Msg.Text = DateTime.Now.ToString();
}
private void button_UpdateTime_Click(object sender, EventArgs e)
{
label_Msg.Text = DateTime.Now.ToString();
}
}
}
При запуске в отладчике VS2017 с F5 это будетостановись на исключении.Продолжение с F5 приведет к завершению приложения.
Но если запустить его из папки bin / debug, дважды щелкнув файл .exe, приложение НЕ остановится или не закроется, независимо от того, как часто я нажимаю кнопку CrashNow.,При нажатии кнопки Обновить отображение времени обновляется так, как если бы исключение не произошло.
Единственное, что делает необработанное исключение, это то, что обновление времени для этой кнопки не работает.
Какэто возможно?
Кстати, мой вопрос не о разнице между Application.ThreadException и AppDomain.CurrentDomain.UnhandledException .На самом деле, я никогда не слышал об этих исключениях.Мой вопрос также не о необходимости обрабатывать оба этих исключения.Мой вопрос и этот другой вопрос, кажется, упоминают тот же метод Application.SetUnhandledExceptionMode ().Это, безусловно, интересный метод.На мой взгляд, мой вопрос не является дубликатом.Однако ссылка на этот другой вопрос может быть полезна для более глубокого понимания того, что происходит под капотом WinForm.