Exception-Handling
Was sind Exceptions? Programmzustände auf Grund unerwarteter Ereignisse („dürfen eigentlich nicht passieren!“) Benutzerverhalten Fehleingaben Systemverhalten Selten vorkommende reguläre Abläufe sind nicht als Ausnahmen zu behandeln Szenarien Über Selektion behandelbar Beispiel Dateiende erreicht Eingabevalidierungen Prinzip: Trennung Nutzcode Fehlerbehandlungscode 31.03.2017
Früher – Behandlung über Returncodes Rückmeldung der fehlerbehafteten Methode an Aufrufer Boolsche Werte, -1, … Nachteile Aufrufer behandelt Ausnahmen mitten im Standardablauf „Eigentlicher“ Algorithmus wird überlagert Bei vielen Exceptions schwer lesbarer Code Aufrufer kann Ausnahme (Rückgabewert) ignorieren „Vogel Strauss-Taktik“ Exceptions „transportieren“ Fehler samt Informationen direkt von der Stelle des Auftretens zur Behandlungsstelle zurück 31.03.2017
Verarbeitung von Ausnahmefällen In der .NET Class Library werden in vielen Fällen Exceptions ausgelöst. Beispiele: - Umwandeln von String “abc“ in Zahl (Convert.ToInt32) - Versuch eine Datei zu öffnen die nicht existiert - Division durch 0 Um ein Programmende verhindern zu können, müssen diese Ausnahmefälle behandelt werden. (Natürlich können auch eigene Exceptions ausgelöst werden… dazu später mehr) 31.03.2017
Was tun, wenn Exception auftritt? Ausnahmesituation bereinigen und Vorgang wiederholen CD/DVD einlegen Neue Benutzereingabe Exception mitloggen und weiter machen Weniger kritische Situationen (Warnings) Exception abfangen und durch eigene Exception (Wrapper) ersetzen Sicherheitsgünde (Infos unterdrücken) An Benutzer angepasste Informationen Exception mit Inner-Exception weiterleiten Benutzer über Ausnahme informieren und Programm beenden 31.03.2017
Exceptions in C# try…catch…finally 31.03.2017
Einfache Exceptionbehandlung Szenario: Konto darf um maximal 1000 € überzogen werden Zuweisung von -2000 € auf Saldo löst Exception aus 31.03.2017
Try – catch - finally 31.03.2017
Eigene Exceptions erzeugen Normalerweise ApplicationException als Basisklasse Properties sind als Zusatzinfo neben Message möglich 31.03.2017
Exception-Hierarchie (1) Alle C#-Ausnahmen leiten sich aus der Klasse Exception ab. Wenn eine Ausnahme auftritt, wird der geeignete catch-Block durch einen Abgleich zwischen Typ der Ausnahme und der angegebenen Exception im catch-Block ermittelt. Ein catch-Block mit exakter Übereinstimmung hat hierbei Vorrang vor einer allgemeineren Ausnahme. 31.03.2017
Exception-Hierarchie (1) class Test { static int Zero = 0; public static void Main() try int j = 22 / Zero; } // Spezifische Ausnahme auffangen catch (DivideByZeroException e) Console.WriteLine("DivideByZero {0}", e); // Verbleibende Ausnahmen auffangen catch (Exception e) Console.WriteLine("Exception {0}", e); Der catch-Block, mit dem die DivideByZeroException aufgefangen wird, stellt die genauere Übereinstimmung dar, daher wird dieser Codeabschnitt ausgeführt. 31.03.2017
Exception-Hierarchie (2) Wird eine Exception innerhalb einer Methode nicht abgefangen, wird die Exception an die aufrufende Methode weitergereicht. Wenn eine Exception auch in der obersten Ebene (Main Methode) nicht abgefangen wird, so wird das Programm beendet! 31.03.2017
Exception-Hierarchie (2) class Test { static int Zero = 0; static void AFunction() int j = 22 / Zero; // Die folgende Zeile wird nie ausgeführt. Console.WriteLine("In AFunction()"); } public static void Main() try AFunction(); catch (DivideByZeroException e) Console.WriteLine("DivideByZero {0}", e); Bei Ausführung der Division wird eine Exception erzeugt. Die Laufzeitumgebung sucht nach einem try-Block in AFunction(), findet jedoch keinen try-Block, daher springt sie aus AFunction() und sucht in Main() nach einem try-Block. Hier ist ein try-Block vorhanden, also wird nach einem entsprechenden catch-Block gesucht. Anschließend wird der catch-Block ausgeführt. 31.03.2017
Inner-Exceptions erzeugen Erzeugen über speziellen Konstruktor Property kann zusätzliche Info liefern Amount soll abgehoben werden Exception auffangen und mit eigenen Infos weitergeben 31.03.2017
Inner-Exceptions auswerten Verarbeiten der Liste von Exceptions 31.03.2017
Ergebnis 31.03.2017
Übersicht der Exception-Klassenhierarchie MSDN 31.03.2017
Properties zum Informationsaustausch 31.03.2017
Zwei Zentrale Exceptionhandler 31.03.2017