Laden...

Fehlermeldungen zentral abfangen ohne Programm danach zu beenden

Erstellt von DeSchneller vor 3 Jahren Letzter Beitrag vor 3 Jahren 445 Views
D
DeSchneller Themenstarter:in
26 Beiträge seit 2011
vor 3 Jahren
Fehlermeldungen zentral abfangen ohne Programm danach zu beenden

Hallo zusammen,

ich habe meinen Exceptionhandler wie folgt geschrieben.


static void MyExceptionHandler(object sender, UnhandledExceptionEventArgs e)
        {
            Exception ex = e.ExceptionObject as Exception;

            switch (ex.GetType())
            {
                default:
                    MessageBox.Show(ex.Message, ex.TargetSite.ToString(), MessageBoxButtons.OK, MessageBoxIcon.Error);
                    break;
            }
        }

Jetzt ist es do, dass er nach Ausgabe der Meldung, das Programm immer beendet. Wie kann ich das verhindern?

Viele Grüße
DeSchneller

U
69 Beiträge seit 2019
vor 3 Jahren

Ich denke du musst noch folgendes setzen:


e.Handled = true;

Edit: das wird wohl noch nicht klappen, das gilt für DispatcherUnhandledExceptionEventArgs

“Knowledge cannot replace friendship. I'd rather be an idiot than lose you.”

  • Patrick to Spongebob
6.911 Beiträge seit 2009
vor 3 Jahren

Hallo DeSchneller,

das switch kannst du dir -- zumindest wie es da steht -- sparen, da keine Fälle unterschieden werden (nur der default-Fall ist da).
Fürs switch schau dir auch Using pattern matching switch statements an.

Wie kann ich das verhindern?

Es gibt auch Fehler die nicht behandelbar sind und den Prozess zwangsweise beenden. Z.B. StackOverflowException, OutOfMemoryException udgl. Siehe dazu auch AppDomain.UnhandledException.

Um welchen Tech-Stack handelt es sich: WinForms, WPF, ...?

Für die MessageBox interessant als Lektüre: Nenne deinen Fall, wo du denkst, ohne modalen Dialog geht es nicht, und ich nenne eine Alternative

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

D
DeSchneller Themenstarter:in
26 Beiträge seit 2011
vor 3 Jahren

das switch kannst du dir -- zumindest wie es da steht -- sparen, da keine Fälle unterschieden werden (nur der default-Fall ist da).

Ja das ist mir schon klar, hab das auch jetzt nur als Beispiel gebracht. Die Unterscheidung wird noch durchgeführt.

Es gibt auch Fehler die nicht behandelbar sind und den Prozess zwangsweise beenden. Z.B. StackOverflowException, OutOfMemoryException udgl. Siehe dazu auch
>
.

Um welchen Tech-Stack handelt es sich: WinForms, WPF, ...?

Ja aber wenn ich es ja über einen normales TryCatch mache, läuft die Applikation auch normal weiter.

Hab aktuell WinForms noch im Einsatz.

U
69 Beiträge seit 2019
vor 3 Jahren

Ja aber wenn ich es ja über einen normales TryCatch mache, läuft die Applikation auch normal weiter.

Nein, bei den von gfoidl genannten Exceptions funktioniert auch ein Try Catch nicht.

“Knowledge cannot replace friendship. I'd rather be an idiot than lose you.”

  • Patrick to Spongebob
4.939 Beiträge seit 2008
vor 3 Jahren

Ich habe es selber noch nicht benutzt, aber wenn ich das Beispiel zu Application.ThreadException richtig verstehe, dann kannst du damit alle UI-Exceptions abfangen und danach das Programm weiterlaufen lassen (ohne Application.Exit() aufzurufen).

Der erste Satz im Kommentar zu der UnhandledException-Ereignismethode ist m.E. aber falsch (wahrscheinlich ein C&P-Fehler), denn bei diesem Ereignis kann man das Beenden nicht verhindern.

Weitere Infos dazu habe ich noch in Global Exception Handler (WinForms) gefunden.

PS: Für jeden weiteren (Worker-)Thread müßtest du selber für ein geeignetes Exception-Handling sorgen.

F
10.010 Beiträge seit 2004
vor 3 Jahren

Ein globaler Exceptionhandler sollte NIEMALS benutzt werden um Exceptions zu behandeln und dann einfach weiter zumachen.
Er ist nur zum loggen und evtl zum aufräumen zu benutzen.