Wir haben eine WPF-Anwendung, bei der Teile davon zur Laufzeit Ausnahmen auslösen können. Ich möchte alle nicht behandelten Ausnahmen global abfangen und protokollieren, aber ansonsten die Programmausführung fortsetzen, als wäre nichts passiert (ein bisschen wie bei VBs On Error Resume Next
).
Ist das in C # möglich? Und wenn ja, wo genau müsste ich den Code für die Ausnahmebehandlung eingeben?
Derzeit sehe ich keinen einzigen Punkt, an dem ich ein try
/ catch
umschließen könnte und der alle möglichen Ausnahmen abfangen würde. Und selbst dann hätte ich alles verlassen, was wegen des Fangs hingerichtet wurde. Oder denke ich hier in schrecklich falsche Richtungen?
ETA: Weil viele Leute unten darauf hingewiesen haben: Die Anwendung ist nicht für die Steuerung von Kernkraftwerken. Wenn es abstürzt, ist es keine große Sache, aber zufällige Ausnahmen, die hauptsächlich mit der Benutzeroberfläche zusammenhängen, sind in dem Kontext, in dem es verwendet wird, ein Ärgernis. Es gab (und gibt es wahrscheinlich immer noch) einige davon und da es eine Plugin-Architektur verwendet und möglicherweise von anderen erweitert wird (in diesem Fall auch von Studenten; also keine erfahrenen Entwickler, die in der Lage sind, vollständig fehlerfreien Code zu schreiben).
Was die Ausnahmen betrifft, die abgefangen werden: Ich protokolliere sie in einer Protokolldatei, einschließlich der vollständigen Stapelverfolgung. Das war der springende Punkt dieser Übung. Nur um den Leuten entgegenzuwirken, die meine Analogie zu VBs OERN zu wörtlich genommen haben.
Ich weiß, dass das blinde Ignorieren bestimmter Fehlerklassen gefährlich ist und meine Anwendungsinstanz beschädigen kann. Wie bereits erwähnt, ist dieses Programm für niemanden geschäftskritisch. Niemand, der bei klarem Verstand ist, würde das Überleben der menschlichen Zivilisation darauf wetten. Es ist einfach ein kleines Werkzeug zum Testen bestimmter Designansätze. Softwareentwicklung.
Für die sofortige Verwendung der Anwendung können in einer Ausnahme nicht viele Dinge passieren:
- Keine Ausnahmebehandlung - Fehlerdialog und Anwendungs-Exit. Das Experiment muss wiederholt werden, wenn auch wahrscheinlich mit einem anderen Probanden. Es wurden keine Fehler protokolliert, was bedauerlich ist.
- Allgemeine Ausnahmebehandlung - harmloser Fehler abgefangen, kein Schaden angerichtet. Dies sollte der übliche Fall sein, der anhand aller Fehler beurteilt wird, die wir während der Entwicklung gesehen haben. Das Ignorieren dieser Art von Fehlern sollte keine unmittelbaren Konsequenzen haben. Die Kerndatenstrukturen sind so gut getestet, dass sie dies leicht überleben können.
- Allgemeine Ausnahmebehandlung - schwerwiegender Fehler, möglicherweise Absturz zu einem späteren Zeitpunkt. Dies kann selten vorkommen. Wir haben es bisher noch nie gesehen. Der Fehler wird trotzdem protokolliert und ein Absturz kann unvermeidlich sein. Dies ist also konzeptionell dem allerersten Fall ähnlich. Nur dass wir einen Stack-Trace haben. Und in den meisten Fällen wird der Benutzer es nicht einmal bemerken.
Zu den vom Programm generierten Versuchsdaten: Ein schwerwiegender Fehler würde im schlimmsten Fall nur dazu führen, dass keine Daten aufgezeichnet werden. Subtile Änderungen, die das Ergebnis des Experiments geringfügig verändern, sind ziemlich unwahrscheinlich. Und selbst in diesem Fall wurde der Fehler protokolliert, wenn die Ergebnisse zweifelhaft erscheinen. man kann diesen Datenpunkt immer noch wegwerfen, wenn es ein totaler Ausreißer ist.
Zusammenfassend: Ja, ich betrachte mich immer noch als zumindest teilweise gesund und ich betrachte keine globale Ausnahmebehandlungsroutine, die das Programm laufen lässt, als absolut böse. Wie bereits zweimal erwähnt, kann eine solche Entscheidung je nach Antrag gültig sein. In diesem Fall wurde es als eine gültige Entscheidung beurteilt und nicht als totaler und völliger Schwachsinn. Für jede andere Anwendung kann diese Entscheidung anders aussehen. Aber bitte beschuldigen Sie mich oder die anderen Leute, die an diesem Projekt gearbeitet haben, nicht, die Welt in die Luft zu jagen, nur weil wir Fehler ignorieren.
Randnotiz: Es gibt genau einen Benutzer für diese Anwendung. Es ist nicht so etwas wie Windows oder Office, das von Millionen verwendet wird, bei denen die Kosten für Ausnahmen für den Benutzer bereits sehr unterschiedlich wären.
On Error Resume Next
in C # nicht möglich ist. Nach einem Exception
(C # hat keine "Fehler") können Sie nicht einfach mit der nächsten Anweisung fortfahren: Die Ausführung wird in einem catch
Block fortgesetzt - oder in einem der in den folgenden Antworten beschriebenen Ereignishandler.