Anwendungen & Unhandled Exceptions

Es kommt vor, dass in einer Anwendung Ausnahmefehler (Exception), aus welchem Grund auch immer, nicht abgefangen und behandelt werden, was zum Absturz der Anwendung führt. Daten und stunden lange Arbeit können dabei verloren gehen, was den Anwender verärgern kann, und alles andere als schön ist.

Es gibt jedoch die Möglichkeit diese Ausnahmefehler abzufangen, um zumindest die Daten oder die Arbeit zu speichern, um danach die Anwendung automatisch wieder neu-starten oder zumindest ein Entschuldigungs-Dialog anzuzeigen.

Dazu gibt es 3 Ereignisse (Events) die einem über eine nicht-abgefangene Fehler informieren:

In einer WPF-Anwendung kann man wie folgt alle nicht-abgefangene Exceptions abfangen und behandeln, oder zumindest loggen:

/// <summary>
/// Interaction logic for App.xaml
/// </summary>
public partial class App : Application
{
    /// <summary>
    /// 1st called method.
    /// </summary>
    /// <param name="e"></param>
    protected override void OnStartup(StartupEventArgs e)
    {
        base.OnStartup(e);
        _MyApp = new AcmeApplication();

        AppDomain currentDomain = AppDomain.CurrentDomain;
        currentDomain.UnhandledException += OnUnhandledException;
        DispatcherUnhandledException += OnUnhandledDispatcherException;
        TaskScheduler.UnobservedTaskException += OnHandledTaskException;
    }

    private void OnUnhandledException(object sender, UnhandledExceptionEventArgs e)
    {
        Logger.Fatal(sender, e.ExceptionObject);
        // ... save data, restart, or shutdown.
    }

    private void OnUnhandledDispatcherException(object sender, DispatcherUnhandledExceptionEventArgs e)
    {
        Logger.Fatal(e.Exception);
        e.Handled = true;
        // ... save data, restart, or shutdown.
    }

    private void OnHandledTaskException(object sender, UnobservedTaskExceptionEventArgs e)
    {
        Logger.Fatal(e.Exception);
        e.SetObserved(); // see: https://docs.microsoft.com/en-us/dotnet/api/system.threading.tasks.unobservedtaskexceptioneventargs?view=net-5.0
    }
}