Fehlerbehandlung in C#: try/catch und mehr
Fehlerbehandlung ist eine der Schlüsselkomponenten zuverlässiger Software. In C# wird dafür der Mechanismus der Ausnahmen (exceptions) verwendet. Die korrekte Anwendung der Konstrukte try, catch und finally ermöglicht es nicht nur, einen Programmabsturz zu vermeiden, sondern macht den Code auch lesbarer und vorhersagbarer. In diesem Artikel behandeln wir die Grundlagen der Ausnahmebehandlung, Best Practices und fortgeschrittene Möglichkeiten, die die .NET-Plattform bietet.
1. Der grundlegende try/catch/finally-Block
Das wichtigste Werkzeug zur Fehlerbehandlung in C# ist der try-catch-finally-Block. Seine Syntax ist intuitiv verständlich:
- try — enthält Code, der eine Ausnahme auslösen kann.
- catch — fängt die Ausnahme ab und behandelt sie.
- finally — wird immer ausgeführt, unabhängig davon, ob eine Ausnahme aufgetreten ist. Es wird zur Freigabe von Ressourcen verwendet (Schließen von Dateien, Datenbankverbindungen).
Betrachten wir ein einfaches Beispiel – die Division durch Null:
using System;
class Program{ static void Main() { try { int a = 10; int b = 0; int result = a / b; // Hier wird eine Ausnahme ausgelöst Console.WriteLine($"Ergebnis: {result}"); } catch (DivideByZeroException ex) { Console.WriteLine($"Fehler: {ex.Message}"); } finally { Console.WriteLine("finally-Block ausgeführt."); } }}Ausgabe des Programms:
Fehler: Versuch, durch Null zu dividieren.finally-Block ausgeführt.Beachten Sie: Wenn kein spezifischer Ausnahmetyp angegeben wird, fängt der catch-Block alle Ausnahmen ab. Das kann praktisch sein, gilt aber oft als schlechte Praxis, da es echte Probleme verbirgt.
2. Ausnahmetypen und ihre Hierarchie
In C# erben alle Ausnahmen von der Basisklasse System.Exception. Die am häufigsten verwendeten sind:
SystemException— Basisklasse für Systemausnahmen.NullReferenceException— Zugriff auf ein Objekt, dasnullist.IndexOutOfRangeException— Zugriff außerhalb der Array-Grenzen.InvalidOperationException— Aufruf einer Methode in einem ungültigen Zustand.ArgumentExceptionund seine Ableitungen (ArgumentNullException,ArgumentOutOfRangeException) — ungültige Methodenargumente.
Sie können mehrere Ausnahmetypen in einem einzigen catch-Block abfangen (seit C# 6):
try{ // Code}catch (ArgumentNullException ex) when (ex.ParamName == "userId"){ Console.WriteLine("Der Parameter userId darf nicht null sein.");}catch (InvalidOperationException ex){ Console.WriteLine($"Ungültige Operation: {ex.Message}");}catch (Exception ex) when (Log(ex, "Unbekannter Fehler")){ // Ausnahmefilter – der Block wird nur ausgeführt, wenn die Bedingung wahr ist throw; // Wirft die Ausnahme weiter}Ausnahmefilter (Schlüsselwort when) ermöglichen eine flexiblere Steuerung der Behandlungslogik, ohne die Aufrufliste zu verlieren.
3. Eigene Ausnahmen erstellen
Manchmal reichen die Standardausnahmen nicht aus. Sie können Ihre eigene Ausnahmeklasse erstellen, indem Sie von Exception erben:
public class InvalidAgeException : Exception{ public int Age { get; }
public InvalidAgeException(int age, string message) : base(message) { Age = age; }
public InvalidAgeException(int age, string message, Exception inner) : base(message, inner) { Age = age; }}Jetzt