Try Catch Richtig benutzen
-
Hi!
Ich wollte mich mal richtig mit Fehlerbehanldung auseinandersetzen. Gibt es eine gute Empfehlung die das Thema behandelt?
Was mich interessiert:
Wann benutze ich Try-Catch-Blöcke?
Wie benutze ich sie Richtig?
-
Die Frage ist gut, weil man tatsächlich oft über katastrophales Exception-Handling stolpert. Aber sie ist auch so allgemein, dass man sie kaum beantworten kann.
Es ist jedenfalls nicht Sinn der Sache, das ganze Programm mit try-catch-Konstrukten vollzukleistern (am besten mit MessageBox.Show(ex.Message) und keiner sonstigen Fehlerbehandlung, irgendwo tief in einer DLL vergraben
)
Du wirst, so als grobe Faustregel, zehnmal mehr try-finally-Blöcke (oder deren Syntaxzucker in Form von using-Direktiven) schreiben. Sobald Du geneigt bist ein catch-Block zu schreiben, musst Du Dir immer die Frage stellen, ob Du überhaupt sinnvoll auf die Exception reagieren kannst.Auf unteren Schichten einer SW kann und will man i.d.R. keine Exceptions behandeln. Man schreibt try-finally-Blöcke um unverwaltete Resourcen freizugeben oder sonstige Aufräumarbeiten vorzunehmen und lässt die Exception dann weiter den Callstack hochwandern.
Es gibt natürlich Ausnahmen. Zum Beispiel eine Exception fangen und ein anderes Objekt (um Informationen erweitert aber vereinheitlicht) weiterwerfen. Oder wenn eine Exception nicht gerenell ein Fehler sondern Teil der Programmlogik ist, was z.B. bei TimeoutExceptions bei der Seriellen Schnittstelle oder beim Auslesen einer FTP-Verzeichnisstruktur vorkommen kann.Die meisten catch-Blöcke dürften sich in den Eventhandlern einer GUI wiederfinden. Aber auch hier: Überlegen ob es sinnvoll ist den Benutzer zu benachrichtigen, welche aussagekräftige Information ihm gegeben werden kann und wie es dann weitergeht. Jeden Eventhandler profilaktisch damit auszustatten ist selten konstruktiv. Ich bevorzuge sowieso defensiv zu programmieren und Exceptions durch vorherige Prüfungen zu vermeiden: Falls möglich natürlich. Es gibt eigentlich ziemlich wenige catch-Blöcke in meinen Projekten, vereinzelt und sinnvoll einsetzen scheint mir der richtige Weg zu sein.
Application.ThreadException und AppDomain.CurrentDomain.UnhandledException sind zwei Events, mit denen Du ungefangene Exceptions behandeln kannst. Außer einer sehr aussagekräftigen Fehlermeldung (inkl. Callstack) kann man da aber nicht mehr viel tun. Trotzdem ist das Gold wert und hat mir schon oft geholfen einen Fehler zu finden.
Bei Threads, der Task-Parallel-Library und Asynchrone-Methodenaufrufen muss man ein paar Dinge berücksichtigen. Was genau bei solchen Ausnahmen passiert und wie man sie an den Mainthread weiterleitet ist aber gut dokumentiert.
Viel Geschwafel, wenig Konkretes, schwierige Frage