Mehrere Exceptions in C# abfangen: Komplettguide

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Auf einen Schlag fangen: So fängst du mehrere Exceptions in C# ohne Code-Duplizierung

\n\n

Stell dir vor: Du entwickelst eine Anwendung, die mit Dateien, Netzwerk und Datenbanken arbeitet. In einer einzigen Methode können FileNotFoundException, IOException oder UnauthorizedAccessException auftreten. Der klassische Ansatz – drei catch-Blöcke mit identischem Code – verletzt das DRY-Prinzip (Don't Repeat Yourself) und verwandelt deinen Code in "Spaghetti".

\n\n

Die gute Nachricht: In C# gibt es mehrere elegante Wege, mehrere Exceptions auf einmal abzufangen. In diesem Tutorial zeigen wir dir alle Varianten – von den Grundlagen bis zu fortgeschrittenen Techniken – und du lernst, wie du sauberen, wartbaren Code für die Fehlerbehandlung schreibst.

\n\n

Warum ist das wichtig? Ein realistisches Szenario

\n\n

Angenommen, du entwickelst eine Konsolenanwendung für Backups. Sie liest Dateien, komprimiert sie und sendet sie an einen entfernten Server. In jeder Phase können unterschiedliche Exceptions auftreten:

\n\n
    \n
  • Datei lesen: FileNotFoundException, PathTooLongException
  • \n
  • Komprimierung: OutOfMemoryException
  • \n
  • Senden: HttpRequestException, TimeoutException
  • \n
\n\n

Wenn du für jede Exception einen separaten catch-Block mit identischer Logging-Logik schreibst, wird der Code schnell unübersichtlich. Und wenn du später die Logik ändern musst, musst du sie an drei Stellen anpassen. Genau hier kommt die Fähigkeit, mehrere Exceptions auf einmal abzufangen, ins Spiel.

\n\n

Methode 1: Klassisch – Mehrere catch-Blöcke (vor C# 6)

\n\n

Die einfachste und offensichtlichste Methode ist, mehrere catch-Blöcke hintereinander zu schreiben. C# wählt automatisch den passenden Block basierend auf dem Exception-Typ aus:

\n\n
try\n{\n    // Code, der verschiedene Exceptions auslösen kann\n    string content = File.ReadAllText(@"C:\\data\\config.txt");\n    int value = int.Parse(content);\n    await SendToServerAsync(value);\n}\ncatch (FileNotFoundException ex)\n{\n    Console.WriteLine($"Datei nicht gefunden: {ex.Message}");\n    LogError(ex);\n}\ncatch (FormatException ex)\n{\n    Console.WriteLine($"Ungültiges Datenformat: {ex.Message}");\n    LogError(ex);\n}\ncatch (HttpRequestException ex)\n{\n    Console.WriteLine($"Netzwerkfehler: {ex.Message}");\n    LogError(ex);\n}
\n\n

Vorteile: transparent, leicht lesbar, jede Exception kann individuell behandelt werden.
\nNachteile: Bei identischen Aktionen führt es zu Code-Duplizierung.

\n\n

Methode 2: Mehrere Exceptions in einem catch abfangen (C# 6+)

\n\n

Seit C# 6 kannst du mehrere Exception-Typen mit | in einem einzigen catch-Block auflisten. Das reduziert Duplizierung und bleibt dennoch lesbar:

\n\n
try\n{\n    // Riskanter Code\n}\ncatch (FileNotFoundException | FormatException | HttpRequestException ex)\n{\n    Console.WriteLine($"Ein Fehler ist aufgetreten: {ex.Message}");\n    LogError(ex);\n    // Zusätzliche Logik, die für alle drei Typen gilt\n}
\n\n

Wichtig: Alle Exceptions müssen hierarchisch kompatibel sein. Du kannst z. B. IOException und NullReferenceException nicht mischen – sie haben außer Exception keinen gemeinsamen Vorfahren. In C# 6+ ist das jedoch erlaubt; der Compiler wandelt die Variable ex einfach in den gemeinsamen Basistyp um.

\n\n

Wann solltest du diese Methode verwenden?

\n
    \n
  • Wenn die Behandlungslogik für alle Exceptions identisch ist.
  • \n
  • Wenn du verschachtelte if- oder switch-Blöcke vermeiden möchtest.
  • \n
  • In kleinen Methoden, bei denen Kürze wichtig ist.
  • \n
\n\n

Methode 3: Exception-Filter (C# 6+)

\n\n

Exception-Filter sind ein mächtiges Werkzeug, mit dem du Exceptions basierend auf einer Bedingung mit dem Schlüsselwort when abfangen kannst. Du kannst dieselbe Exception abfangen, aber je nach ihren Eigenschaften unterschiedliche Logik anwenden:

\n\n
try\n{                

Blogs

Buchempfehlungen