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

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

von Patrick
22.04.2020
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.

1. 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.

2. 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

3. 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

4. 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

5. 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.



Bislang gibt es keine Kommentare. Markier dein Revier und sei der Erste!

Schreibe einen Kommentar

Das könnte dich auch interessieren

Arrow-up

Programmieren lernen war noch nie so einfach.

Lerne von echten Experten durch echte Praxisprojekte und mit individueller Hilfe, falls du mal nicht weiterkommst!

keine Zahlungsdaten notwendig!