Menu
Coddy logo textTech

Was ist Ausnahmebehandlung?

Ausnahmebehandlung (Exception Handling) ist eine Möglichkeit für ein Programm, auf Fehler zu reagieren, die während der Ausführung auftreten. Code, der scheitern könnte, steht in einem geschützten Block wie try, und wird ein Fehler geworfen, springt die Ausführung zu einem Handler wie except oder catch, statt abzustürzen.

Von Kevin Spektor, Mitgründer & CTO

Aktualisiert am 24. September 2026

Ein Programm, das Leute nach ihrem Alter fragt, bekommt früher oder später "twenty" statt 20. Diesen Text umzuwandeln ist ein Laufzeitfehler: int("twenty") wirft ValueError, und ohne Plan dafür hält das Programm an. Ausnahmebehandlung ist dieser Plan. Du markierst den Code, der scheitern könnte, und schreibst den Code, der dann läuft.

Next year you will be 35
Not a number: twenty
Next year you will be 20
Done

Die falsche Antwort wird gemeldet, und die Schleife macht mit der nächsten weiter. Ohne das try hätte das Programm eine Zeile ausgegeben und dann einen Traceback.

Wie Ausnahmebehandlung funktioniert

  1. Der Code in try läuft ganz normal.
  2. Eine Operation scheitert, und die Laufzeitumgebung wirft eine Ausnahme: ein Objekt mit einem Typ (ValueError) und einer Meldung (invalid literal for int() with base 10: 'twenty').
  3. Der try-Block hält an dieser Zeile an. Seine restlichen Zeilen werden übersprungen, deshalb wird "Next year you will be" für "twenty" nicht ausgegeben.
  4. Die Laufzeitumgebung vergleicht den Typ der Ausnahme von oben nach unten mit jeder except-Klausel und führt die erste aus, die passt.
  5. Wenn der Handler fertig ist, macht das Programm mit der ersten Zeile nach der gesamten try-Anweisung weiter.
  6. Passt keine Klausel, verlässt die Ausnahme die aktuelle Funktion, und die Suche geht in der aufrufenden Funktion weiter, dann in deren Aufrufer. Das nennt man das Abwickeln des Aufrufstapels. Erreicht die Suche die oberste Ebene des Programms ohne Treffer, endet das Programm mit einem Traceback.

Schritt 6 bedeutet, dass der Handler nicht in der Funktion stehen muss, in der der Fehler passiert. Hier liegt der Fehler zwei Aufrufe tief, und der Handler ganz unten fängt ihn trotzdem:

parsing 4.50
parsing free
Could not add the prices: could not convert string to float: 'free'

float("free") ist in parse_price gescheitert. Weder parse_price noch total hatte einen Handler, also wurden beide abgebrochen, und "3.20" wurde nie geparst. Das ist die zentrale Entwurfsentscheidung, die Ausnahmebehandlung dir gibt: Behandle einen Fehler dort, wo du weißt, was zu tun ist, und das ist oft weit entfernt von der Stelle, an der er passiert ist.

try, except, else und finally

Die try-Anweisung in Python hat zwei weitere optionale Teile. else läuft nur, wenn der try-Block ohne Ausnahme fertig geworden ist. finally läuft in jedem Fall: nach Erfolg, nach einer behandelten Ausnahme und sogar dann, wenn die Funktion aus dem try heraus zurückkehrt.

no error
finally runs either way
2.0
b was zero
finally runs either way
None

In den finally-Block gehört das Aufräumen: eine Datei schließen, eine Sperre freigeben, eine Datenbankverbindung schließen. In Python erledigt die with-Anweisung dieses Aufräumen für Dateien automatisch, und sie ist dafür die übliche Wahl.

Eigene Ausnahmen werfen

Ausnahmen gibt es nicht nur für Fehler, die die Sprache erkennt. Bekommt deine eigene Funktion eine Eingabe, mit der sie nicht arbeiten kann, kann sie eine Ausnahme werfen, um abzulehnen, und der Aufrufer entscheidet, was als Nächstes passiert. Eine kleine eigene Ausnahmeklasse gibt dem Fehler einen Namen, der ihn beschreibt.

70
Refused: cannot take 250, balance is 100

Python verwendet raise. Java, C++ und JavaScript verwenden dafür throw.

Ausnahmebehandlung in anderen Sprachen

SpracheSchlüsselwörterGut zu wissen
Pythontry, except, else, finally, raiseJede Ausnahme ist ein Objekt, das von BaseException erbt
Javatry, catch, finally, throw, throwsGeprüfte Ausnahmen wie IOException müssen gefangen oder mit throws deklariert werden
C++try, catch, throwKein finally; Destruktoren räumen beim Abwickeln des Stacks auf
JavaScripttry, catch, finally, throwFehler in async-Code fängst du mit try um das await
CkeineFunktionen geben einen Fehlercode zurück, und viele setzen errno
Gokeine für gewöhnliche FehlerFunktionen geben einen error-Wert zurück, den der Aufrufer prüft

Dasselbe Parsing-Beispiel sieht in Java so aus:

try {
    int age = Integer.parseInt("twenty");
    System.out.println(age + 1);
} catch (NumberFormatException e) {
    System.out.println("Not a number: " + e.getMessage());
} finally {
    System.out.println("done");
}

Java teilt Ausnahmen in zwei Gruppen. Geprüfte Ausnahmen (Checked Exceptions) wie IOException beschreiben Probleme außerhalb der Kontrolle des Programms, und der Compiler weigert sich, Code zu bauen, der sie weder fängt noch deklariert. Ungeprüfte Ausnahmen, Unterklassen von RuntimeException wie NullPointerException, bedeuten meist einen Bug, und der Compiler zwingt dich nicht, sie zu behandeln.

Häufige Fehler

  • Alles fangen. Ein nacktes except: fängt in Python auch KeyboardInterrupt, sodass Strg+C nicht mehr funktioniert, und except Exception: fängt Bugs, mit denen du nie gerechnet hast. Fang den konkreten Typ, von dem du weißt, wie du ihn behandelst.
  • Den Fehler verschlucken. except ValueError: pass versteckt das Problem. Gib zumindest aus oder protokolliere, was schiefgelaufen ist.
  • Ein zu großer try-Block. Umschließ nur die Zeilen, die die gefangene Ausnahme werfen können, damit nicht versehentlich ein anderer Fehler behandelt wird.
  • Bugs fangen statt beheben. Ein IndexError aus einer Schleife, die einen Schritt zu weit läuft, ist ein Fehler im Code. Ihn zu behandeln hält den falschen Code am Leben.
  • Erwarten, dass catch einen Absturz in C oder C++ verhindert. Ein Segmentation Fault ist ein Signal des Betriebssystems, keine Ausnahme, und unter Linux und macOS bekommt ein catch (...) in C++ ihn nie zu sehen.

Wie es weitergeht

Die Fehler, auf die Ausnahmebehandlung reagiert, beschreibt die Seite zu Laufzeitfehler, den Absturz, den sie nicht fangen kann, die Seite zu Segmentation Fault. Die vollständige Syntax findest du in den Anleitungen zu Python-Ausnahmen, try und catch in Java, C++-Ausnahmen und try und catch in JavaScript. Der Java-Kurs und der Python-Kurs üben beides mit echten Aufgaben.

Häufig gestellte Fragen

Welche 5 Schlüsselwörter gibt es bei der Ausnahmebehandlung in Java?
try, catch, finally, throw und throws. try markiert den zu überwachenden Code, catch behandelt einen bestimmten Ausnahmetyp, und finally führt Aufräumcode aus, egal ob eine Ausnahme aufgetreten ist. throw wirft eine Ausnahme, und throws in einer Methodensignatur gibt an, welche geprüften Ausnahmen die Methode an ihren Aufrufer weitergeben kann.
Wie funktioniert Ausnahmebehandlung in C++?
C++ verwendet try, catch und throw. Werfen lässt sich jeder Typ, aber nach Konvention wirfst du ein von std::exception abgeleitetes Objekt wie std::runtime_error und fängst es per Referenz: catch (const std::exception& e). C++ hat kein finally; das Aufräumen geschieht in Destruktoren, die beim Abwickeln des Stacks automatisch laufen.
Was ist der Unterschied zwischen einem Error und einer Exception?
Im Alltag ist ein Fehler alles, was schiefgeht, und eine Ausnahme das Objekt, mit dem eine Sprache ihn meldet. Java zieht eine schärfere Grenze: Exception umfasst Probleme, die ein Programm sinnvoll behandeln kann, während Error, etwa OutOfMemoryError oder StackOverflowError, ein Versagen der JVM anzeigt, das ein Programm meist nicht fangen sollte. In Python sind ValueError und ZeroDivisionError trotz ihrer Namen beide Ausnahmen.
Was ist der Unterschied zwischen throw und throws in Java?
throw ist eine Anweisung, die an genau dieser Stelle eine Ausnahme wirft: throw new IllegalArgumentException("negative age");. throws ist Teil einer Methodendeklaration und listet die geprüften Ausnahmen auf, die die Methode an ihren Aufrufer weitergeben darf: void load() throws IOException. Der Compiler zwingt dann jeden Aufrufer, diese Ausnahme entweder zu fangen oder ebenfalls zu deklarieren.
Macht Ausnahmebehandlung Code langsamer?
Das Betreten eines try-Blocks ist in den meisten modernen Sprachen billig. Seit Python 3.11 kostet ein try fast nichts, wenn keine Ausnahme geworfen wird, und die großen C++-Compiler fügen dem Pfad, auf dem nichts geworfen wird, keine Laufzeitkosten hinzu. Eine Ausnahme zu werfen und zu fangen ist viel langsamer als ein if-Test, also prüf in performancekritischen Schleifen die häufigen Fälle, statt dich auf Ausnahmen zu verlassen.
Coddy programming languages illustration

Lerne mit Coddy zu programmieren

LOS GEHT'S