Если словить необработанный экскепшен, то появится окно с кнопками Продолжить
и Выйти
. Если нажать Выйти
, то программа закроется, но при этом (зачем-то) срабатывает обработчик события закрытия формы. Если там, например, сохраняются настройки, то конфиг может сломаться.
А как узнать, что программа закрывается аварийно, чтобы не выполнять никаких действий?
Тут как-то не особо понятно
Ну получается можно сделать базовую форму и снабдить ее нужным функционалом:
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) {