Wie man mehrere Ausnahmen in Kotlin auf einmal abfängt: Eine vollständige Anleitung mit Code

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

Einleitung: Warum dieses Thema Stack Overflow zum Beben bringt?

\n\n

Wenn Sie jemals in Kotlin programmiert und mehrere verschiedene Ausnahmen abfangen mussten, wissen Sie, dass das schmerzhaft sein kann. Besonders wenn Sie aus Java kommen, wo Multi-Catch (catch (IOException | SQLException e)) seit Java 7 Standard ist. In Kotlin ist alles anders, und viele Entwickler sind verwirrt.

\n\n

Die Frage "How to catch many exceptions at the same time in Kotlin?" auf Stack Overflow hat tausende Aufrufe gesammelt. Und das ist kein Zufall: Fehlerbehandlung ist etwas, mit dem absolut jeder konfrontiert wird. Heute werden wir diese Aufgabe ein für alle Mal klären.

\n\n

In diesem Artikel erfahren Sie:

\n
    \n
  • Warum Multi-Catch in Kotlin nicht wie in Java funktioniert
  • \n
  • Wie Sie mehrere Ausnahmen elegant und kompakt abfangen
  • \n
  • Wann Sie when in catch verwenden und wann das gute alte if
  • \n
  • Reale Beispiele aus dem Produktivcode
  • \n
\n\n

Los geht's!

\n\n

Das Problem: Wo ist mein Multi-Catch?

\n\n

In Java schreiben Sie einfach:

\n
try {\n    riskyOperation()\n} catch (IOException | SQLException e) {\n    // gleich behandeln\n}\n
\n\n

Schön, prägnant, verständlich. Aber in Kotlin gibt es keine solche Syntax. Wenn Sie versuchen, catch (IOException | SQLException e) zu schreiben, sagt der Compiler "nein".

\n\n

Warum? Weil Kotlin sich für Klarheit und Sauberkeit entschieden hat. Die Sprachentwickler entschieden, dass Multi-Catch mit senkrechtem Strich nicht wirklich Kotlin-Stil ist. Aber das bedeutet nicht, dass Sie keine mehreren Ausnahmen abfangen können. Es wird nur anders gemacht.

\n\n

Schauen wir uns die drei Hauptmethoden an.

\n\n

Methode 1: Mehrere catch-Blöcke (die offensichtlichste)

\n\n

Der einfachste Weg ist, einfach mehrere catch-Blöcke hintereinander zu setzen. Kotlin unterstützt das hervorragend.

\n\n
try {\n    val data = loadData()\n    processData(data)\n} catch (e: IOException) {\n    println("E/A-Fehler: ${e.message}")\n} catch (e: SQLException) {\n    println("Datenbankfehler: ${e.message}")\n} catch (e: Exception) {\n    println("Unbekannter Fehler: ${e.message}")\n}\n
\n\n

Vorteile:

\n
    \n
  • Absolut klar – jeder Ausnahmetyp wird separat behandelt
  • \n
  • Unterschiedliche Logik für verschiedene Fehler möglich
  • \n
  • Für Anfänger gut lesbar
  • \n
\n\n

Nachteile:

\n
    \n
  • Viel Code-Duplizierung, wenn die Behandlungslogik gleich ist
  • \n
  • Bei 5+ Ausnahmen wird der Block unhandlich
  • \n
\n\n

Methode 2: catch mit when (elegant und flexibel)

\n\n

Hier zeigt Kotlin seine ganze Stärke. Anstelle von Multi-Catch können Sie when innerhalb eines einzelnen catch-Blocks verwenden.

\n\n
try {\n    val result = fetchFromNetwork()\n    saveToDatabase(result)\n} catch (e: Exception) {\n    when (e) {\n        is IOException -> handleNetworkError(e)\n        is SQLException -> handleDatabaseError(e)\n        is SecurityException -> logAndNotify(e)\n        else -> throw e // weiterwerfen, wenn wir nicht wissen, wie wir es behandeln sollen\n    }\n}\n
\n\n

Dieser Ansatz ist ein echter Glücksgriff. Er ermöglicht:

\n
    \n
  • Behandlung verschiedener Ausnahmen an einer Stelle
  • \n
  • Nutzung aller when-Funktionen, einschließlich Bedingungsprüfungen
  • \n
  • Einfaches Hinzufügen neuer Ausnahmetypen
  • \n
\n\n

Hier ein fortgeschritteneres Beispiel mit Bedingungen:

\n\n
try {\n    connectToService()\n} catch (e: Exception) {\n    when {\n        e is IOException && e.message?.contains("timeout") == true -> \n            println("Verbindungs-Timeout, versuche erneut")\n        e is IOException -> \n            println("Netzwerkfehler: ${e.message}")\n        e is SQLException && e.errorCode == 1045 -> \n            println("Authentifizierungsfehler in der Datenbank")\n        else ->                

Blogs

Buchempfehlungen