Fehler in Python handhaben: Try, Except, Else und Finally

    Avatarbild von Patrick
    Patrick

    veröffentlicht am: 22.04.2020
    zuletzt aktualisiert am: 02.02.2023

    Python try, except, else & finally: Fehlerhandhabung in Python

    Oft treten in unseren Programmen Fehler auf, sei es ob durch Nutzereingaben oder die Logik unseres Programmes. Wo andere Programmiersprachen try-catch-Blöcke zur Verfügung stellen, haben wir in Python try und except.

    Fehler mit try und except abfangen

    Um trotz auftretender Fehler weiterhin Quellcode ausführen zu können, kannst du deinen Code in tryexcept-Blöcke setzen, wie im Folgenden gezeigt:

    try:
        print(x)
    except:
        print('Konnte x nicht in der Konsole anzeigen')
    # Konnte x nicht in der Konsole anzeigen

    Im vorigen Code ist ein Fehler aufgetreten, da die Variable x nicht definiert ist, im Nächsten zeige ich dir, wie du den Fehler direkt ausgeben kannst, statt eine eigene Fehlermeldung zu schreiben.

    try:
        print(x)
    except Exception as e:
        print("Fehlermeldung:", e)
    # Fehlermeldung: name 'x' is not defined

    Wenn du die Bezeichnung der auftretenden Fehler genauer angibst, kannst du auf einzelne Fehler reagieren, worauf ich auch am Ende des Beitrages nochmals genauer eingehen werde.

    try:
        1/0
    except ZeroDivisionError as e:
        print('Fehler:', e)
    # Fehler: division by zero
    try:
        f = open('MeineDatei.txt')
    except OSError as e:
        print('Fehler:', e)
    # Fehler: [Errno 2] No such file or directory: 'MeineDatei.txt'

    Eine Liste mit allen in Python eingebauten Ausnahmen findest du in der Dokumentation auf Python.org.

    Mit else Code ausführen, wenn kein Fehler aufgetreten ist

    Wenn du else verwendest, kannst du Code schreiben, der nur ausgeführt wird, wenn keine Ausnahmen oder Fehler aufgetreten sind.

    try:
        print("Es sind")
    except:
        print("Fehler aufgetreten")
    else:
        print("keine Fehler aufgetreten")
    # Es sind
    # keine Fehler aufgetreten

    finally nutzen, um Code auszuführen, egal ob ein Fehler aufgetreten ist oder nicht

    Das Schlüsselwort finally lässt dich Code am Ende des Blocks ausführen, egal ob Fehler aufgetreten sind oder nicht.

    try:
        print(x)
    except:
        print('Konnte x nicht in der Konsole anzeigen')
    finally:
        print("Fertig.")
    # Konnte x nicht in der Konsole anzeigen
    # Fertig.

    Die folgenden Beispiele sind stark angelehnt an die Dokumentation von python.org (siehe auch https://docs.python.org/3/tutorial/errors.html#defining-clean-up-actions).

    Bei der Verwendung von finally solltest du allerdings vorsichtig sein, vor allem bei Rückgabewerten, da der Wert von finally durchaus den Wert aus try überschreiben kann. Im folgenden Beispiel wäre es besser gewesen, statt finally except zu verwenden, um den Wert aus try zu erhalten.

    def boolean_return_beispiel():
        try:
            return True
        finally:
            return False
    print(boolean_return_beispiel())
    # False

    Teilen mit den vier Schlüsselwörtern

    Im Folgenden möchte ich dir anhand eines modifizierten Beispiels aus der Python-Dokumentation zeigen, wie du alle vier Schlüsselwörter in Kombination verwenden kannst, hier mit einfachem Teilen.

    def teilen(x, y):
        try:
            Ergebnis = x / y
        except ZeroDivisionError as e:
            print(e)
        else:
            print("Das Ergebnis ist", Ergebnis)
        finally:
            print("Fertig mit teilen.")
    teilen(2, 1)
    # Das Ergebnis ist 2.0
    # Fertig mit teilen.
    teilen(2, 0)
    # division by zero
    # Fertig mit teilen.
    teilen("2", "1")
    # Fertig mit teilen.
    # Traceback (most recent call last):
    #   File ".\try_except_finally.py", line 67, in <module>
    #     teilen("2", "1")
    #   File ".\try_except_finally.py", line 58, in teilen
    #    Ergebnis = x / y
    # TypeError: unsupported operand type(s) for /: 'str' and 'str'

    Dieses Beispiel fängt jedoch lediglich den ZeroDivisionError ab, welcher auftritt, wenn du versuchst, durch 0 zu teilen.
    In diesem Beispiel wird einfach ein Text ausgegeben.
    Da keine weiteren Ausnahmefälle definiert sind, tritt beim dritten Aufruf der Funktion teilen(“2”, “1”) ein TypeError auf, da die beiden Parameter vom Typ String sind, was sich jedoch leicht beheben lässt.

    def teilen(x, y):
        try:
            Ergebnis = x / y
        except ZeroDivisionError as e:
            print(e)
        except TypeError:
            x = int(x)
            y = int(y)
            teilen(x, y)
        else:
            print("Das Ergebnis ist", Ergebnis)
        finally:
            print("Fertig mit Teilen.")
    teilen("2", "1")
    # Das Ergebnis ist 2.0
    # Fertig mit Teilen.
    # Fertig mit Teilen.

    Da in dem except-Block für TypeError ein weiterer Aufruf teilen mit den zu int konvertierten Parametern steht, wird der finally-Block doppelt ausgeführt, weswegen “Fertig mit Teilen.” in der Textausgabe zwei Mal angezeigt wird.
    Weiterhin ist in der Behandlung von TypeError eine weitere mögliche Fehlerquelle enthalten.

    teilen("r", "1")

    Hier wird uns eine Fehlermeldung ausgegeben, da der Parameter “r” nicht in int konvertiert werden kann.

    Fertig mit Teilen.
    Traceback (most recent call last):
      File ".\try_except_finally.py", line 74, in teilen
        Ergebnis = x / y
    TypeError: unsupported operand type(s) for /: 'str' and 'str'
    
    During handling of the above exception, another exception occurred:
    
    Traceback (most recent call last):
      File ".\try_except_finally.py", line 86, in <module>
        teilen("r", "1")
      File ".\try_except_finally.py", line 78, in teilen
        x = int(x)
    ValueError: invalid literal for int() with base 10: 'r'

    Um diesen Missstand zu beheben, kannst du in den TypeErrorexcept-Block einen weiteren tryexcept-Block einfügen.

    def teilen(x, y):
        try:
            Ergebnis = x / y
        except ZeroDivisionError as e:
            print(e)
        except TypeError:
            try:
                x = int(x)
                y = int(y)
            except Exception:
                print('x und y müssen Zahlen sein')
            else:
                teilen(x, y)
        else:
            print("Das Ergebnis ist", Ergebnis)
        finally:
            print("Fertig mit Teilen.")
    teilen("r", "1")
    # x und y müssen Zahlen sein
    # Fertig mit Teilen.

    Wichtig ist hierbei zu beachten, dass der Aufruf teilen im try oder else-Block stehen muss, da ansonsten eine Endlosschleife erzeugt wird, was dann in etwa so aussieht:

    Ausgabe beim Ausführen einer Endlosschleife

    Fazit

    Fehler beim Programmieren gehören zum Alltag, mit try und den zugehörigen Schlüsselwörtern else, except und finally kannst du diese entsprechend behandeln, was dir durch die in Python bereits implementierten “Exceptions” einfacher gemacht wird.

    Wenn dir dieser Beitrag gefallen hat, du Fragen oder Anmerkungen hast, dann schreib mir doch einen Kommentar.

    😩 Gelangweilt von den Udemy & YouTube-Tutorials?!

    Lerne spielerisch Python und komme deiner gutbezahlten (und an der 🌴 liegenden) Traumkarriere einen Schritt weiter.

    TP Star TP Star TP Star TP Star TP Star

    "Für Leute die gerne Python oder Java lernen wollen ist Codegree klasse. Ist nicht wie bei anderen Konkurrenten auf Videokursen aufgebaut..."

    - Lennart Sparbier

    100% kostenlos registrieren · keine Kreditkarte notwendig

    👋 Wir warten bereits auf dich!

    Lerne das, was du wirklich brauchst.

    Im Gegensatz zu der Abendschule oder der alteingesessenen Uni lernst du bei codegree die Sprachen & Pakete, die wirklich im Jobmarkt gesucht werden.

    Logo von Python
    Logo von PyTorch
    Logo von Pandas
    Logo von Matplotlib
    Logo von Java
    Logo von NumPy
    Mehr erfahren

    100% kostenlos registrieren · keine Zahlungsdaten notwendig