Аварийный выход при ошибке

Если словить необработанный экскепшен, то появится окно с кнопками Продолжить и Выйти. Если нажать Выйти, то программа закроется, но при этом (зачем-то) срабатывает обработчик события закрытия формы. Если там, например, сохраняются настройки, то конфиг может сломаться.
А как узнать, что программа закрывается аварийно, чтобы не выполнять никаких действий?

Тут как-то не особо понятно :man_shrugging:

Ну получается можно сделать базовую форму и снабдить ее нужным функционалом:

    public class basedForm: Form
    {
        public bool Exception = false;
    }

И все формы делать производными от этого класса.

 static class Program
    {
        /// <summary>
        /// Главная точка входа для приложения.
        /// </summary>
        [STAThread]
        static void Main()
        {

            Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
            Application.ThreadException += Application_ThreadException;

            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }

        private static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e)
        {  

            foreach (Form form in Application.OpenForms)
            {
                if (form is basedForm bf)
                {
                    bf.Exception = true;
                }
            }

            Application.Exit();
        }
    }

И в стандартном обработчике закрытия можно тогда проверять флаг или что то другое

public partial class Form1 : basedForm
    {

      private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {

            if(Exception)
            {
                // закрылись потому что сломались. Делаем выводы...
            }
        }
    }

Там, действительно, CloseReason.ApplicationExitCall приходит. Так что, можно просто if (e.CloseReason != CloseReason.ApplicationExitCall) {