Почему мое приложение не останавливается после необработанного исключения? - PullRequest
1 голос
/ 08 мая 2019

Я хочу узнать, как работает журнал событий 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.

1 Ответ

3 голосов
/ 08 мая 2019

Прочитав документ ms по ссылке , предложенной комментарием steve16351, я узнал, что приложение Windows Forms имеет обработчик исключений по умолчанию.

Отключив этот обработчик перед созданием Формы в Program.cs, используя:

Application.SetUnhandledExceptionMode(UnhandledExceptionMode.ThrowException);

необработанное исключение вызовет другое диалоговое окно с опциями

  • проверьте онлайн решение и закройте программу
  • закрыть программу
  • отладка программы

так что теперь нет возможности продолжить с кнопкой Обновить.

PS: Мне жаль видеть, что он удалил свой комментарий как раз перед тем, как я хотел его проголосовать


Обновление:

Как глупо может звучать этот вопрос, оказалось, что этот параметр важен, если вы хотите перехватить все исключения вашего приложения WinForms с помощью блока try-catch в Program.cs. Без этого параметра исключения в форме перехватываются в таком блоке только при запуске в отладчике VS, но не при двойном щелчке * .exe в окне проводника.

Исключение, брошенное в Форму, по-видимому, считается необработанным, если оно не обнаружено в Форме. Вы можете попытаться перехватить его в Program.cs, который создал форму, но обработчик приложения по умолчанию может перехватить его первым. Странно, но факт: -)

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