groovy-lecture/skript/exceptions.md

2.3 KiB

Exception-Handling:

Grundsätzlich ähnelt sich die Ausnahmebehandlung in Groovy der in Java sehr, weshalb dies ein eher kurzes Kapitel wird. Dennoch wollen wir hier auf einige Grundlagen und Besonderheiten eingehen.

Vererbungshierarchie:

Es gilt die selbe Vererbungshierarchie, wie in Java. Alle Exception Klassen sind von der Klasse Exception, und somit auch indirekt von Throwable abgeleitet. Will man eigene Exceptions schreiben, müssen diese also von Exception erben.

Ausnahmen fangen:

Zum Fangen von Ausnahmen werden auch in Groovy try-catch-finally Blöcke benutzt.

  • try: Dieser Block enthält den gefährlichen Code, der potentiell Ausnahmen werfen könnte.
  • catch: Hier findet die eigentliche Fehlerbehandlung statt. Die Exceptions sollen hier nicht einfach ausgegeben bzw. ignoriert werden, sondern sinnvoll behandelt werden
  • finally: Dieser Block ist gedacht für Aufräumarbeiten und wird immer ausgeführt, egal ob das Programm abrubt beendet wird durch Eintritt in den catch-Block, oder normal beendet wird.

Es können auch mehrere catch-Blocke nach einem try-Block folgen. Der Compiler wählt hier den ersten passenden Block aus. Deshalb gilt: Man soll beim Schreiben der catch-Blöcke immer vom Spezifischen zum Allgemeinen gehen.

try {
// Code der die Exception werfen kann
} catch (IOException e) {
    // Fehlerbehandlung
} catch (Exception e) {
    // Fehlerbehandlung
}

Dynamische Ausnahmebehandlung:

Anders als in Java muss in Groovy der Typ der Exception nicht angegeben werden. Da Groovy eine dynamisch typisierte Sprache ist, kann hier auch einfach nur der Variablenname angegeben werden. Der Compiler wählt dann die passende Exception zur Laufzeit aus.

try {
    def result = 1 / 0
} catch (e) {
    e.printStackTrace()
    // Ausgabe: Caught an exception: Divison by zero
}

GString-Interpolation bei Exceptions:

Groovy erlaubt es die Exception Message dierekt durch die GString Interpolation auszugeben. Dadurch kann man Individuellere Konsolenausgaben bei Fehlerbehandlungen erreichen.

try {
    def file = new File("gibtesnicht.txt")
    file.text
} catch (e) {
    println "Datei wurde nicht gefunden: ${e.message}"
}
// Ausgabe: Datei wurde nicht gefunden: gibtesnicht.txt (No such file or directory)