Impressum
< Index

Ausnahmen behandeln

Eine Ausnahme (engl. Exception) ist ein Fehler im Programmablauf. Diese Fehler müssen gesondert behandelt werden.
Soll ein Benutzer eine Zahl eingeben, gibt aber einen Text ein, so schlägt die Umwandlung von der Eingabe in eine Zahl mit einem ValueError fehl.
Um nicht das ganze Programm abzubrechen kann man derartige Codeteile in ein try-except einpacken.
Der mit try: eingeleitete Block ist der eigentliche Programmcode. Ihm schließt sich ein oder mehrere except Blöcke an.
Wird nur ein except: angegeben landet jeder Fehler aus dem try-Block sofort dort.
Werden mehrere except-Blöcke angegeben, so müssen alle (bis auf den letzten) den Fehler angeben, den sie behandeln.
Exception
try:
    s = input("Zahl eingeben:")
    i = int(s)
    e = 5/i
    print(e)
except ValueError:
    print("Das war keine Zahl")
except ZeroDivisionError:
    print("Das war eine 0")
except:
    print("Anderer Fehler")
            
Eingabe einer ganzen Zahl
while True:
    try:
        s = input("Zahl eingeben:")
        i = int(s)  # hier wird ggf. die Exception geworfen 
        break       # hier endet die Schleife
    except ValueError:
        pass
Um die Nachricht in einer Exception anzuzeigen muss man das Exception-Objekt benennen mit except ValueError as e:.
Dann kann man z.B. mit print(str(e)) verwenden um die Exception auszugeben.

Assertions

Zusicherungen (engl. Assertions) sind Bedingungen, die wahr sein müssen, damit das Programm korrekt ablaufen kann.
In Python kann man mit assert Bedingung eine Zusicherung einfordern. Ist die Bedingung falsch wird ein AssertionError geworfen, den man in except AssertionError: behandeln kann.
Eingabe einer positiven Zahl
while True:
    try:
        s = input("Zahl eingeben:")
        i = int(s)  # ggf. ValueError
        assert i>0  # ggf. AssertionError
        break       # hier endet die Schleife
    except ValueError:
        print("Eine Zahl, Alter!")
    except AssertionError:
        print("Sei mal positiv!")

Exception auslösen

Mittels raise Exception("Informativer Text") kann man selbst eine Exception auslösen.
Eingabe einer positiven Zahl
while True:
    try:
        s = input("Zahl eingeben:")
        i = int(s)  # ggf. ValueError
        if i<0: 
           raise ValueError("zu negativ") # ValueError mit eigener Meldung
        break       # hier endet die Schleife
    except ValueError as e:
        print("Fehler", str(e))
Dies gibt im falle der Eingabe einer negativen Zahl die Meldung "Fehler zu negativ" aus.

finally

Einem try-except-Block kann ein finally-Block angehängt werden.
Die Anweisungen im finally-Block werden auf jeden Fall ausgeführt!
In den meisten Fällen ist der finally-Block gleich wie ein Code-Block der nach dem try-except kommt.
Die Ausnahme ist, wenn im try oder except-Block z.B. ein break oder return stattfindet.
Der finally-Block wird trotzdem ausgeführt.
finally Beispiel
while True:
    try:
        s = input("Zahl eingeben:")
        i = int(s)  # ggf. ValueError
        break       # hier endet die Schleife
    except ValueError:
        print("Eine Zahl, Alter!")
    finally:
        print("Immer")
print("Immer") wird hier ausgeführt, egal ob ein ValueError auftritt oder nicht!
Während im unteren Beispiel das print("immer") nur bei einem Fehler ausgeführt wird, da sonst das break die Schleife beendet
while True:
    try:
        s = input("Zahl eingeben:")
        i = int(s)  # ggf. ValueError
        break       # hier endet die Schleife
    except ValueError:
        print("Eine Zahl, Alter!")
    print("Immer")
finally wird meist eingesetzt um aufzuräumen: Hier schließt man offene Dateien, beendet Datenbank-Verbindungen sauber etc.
Da diese Arbeit im Erfolgsfall genau so wie im Fehlerfall nötig ist muss man diesen Code nicht doppelt schreiben.

Python-Exceptions

In Python gibt es eine Menge vordefinierte Ausnahmen:
    BaseException
    ├── BaseExceptionGroup
    ├── GeneratorExit
    ├── KeyboardInterrupt
    ├── SystemExit
    └── Exception
            ├── ArithmeticError
            │    ├── FloatingPointError
            │    ├── OverflowError
            │    └── ZeroDivisionError
            ├── AssertionError
            ├── AttributeError
            ├── BufferError
            ├── EOFError
            ├── ExceptionGroup [BaseExceptionGroup]
            ├── ImportError
            │    └── ModuleNotFoundError
            ├── LookupError
            │    ├── IndexError
            │    └── KeyError
            ├── MemoryError
            ├── NameError
            │    └── UnboundLocalError
            ├── OSError
            │    ├── BlockingIOError
            │    ├── ChildProcessError
            │    ├── ConnectionError
            │    │    ├── BrokenPipeError
            │    │    ├── ConnectionAbortedError
            │    │    ├── ConnectionRefusedError
            │    │    └── ConnectionResetError
            │    ├── FileExistsError
            │    ├── FileNotFoundError
            │    ├── InterruptedError
            │    ├── IsADirectoryError
            │    ├── NotADirectoryError
            │    ├── PermissionError
            │    ├── ProcessLookupError
            │    └── TimeoutError
            ├── ReferenceError
            ├── RuntimeError
            │    ├── NotImplementedError
            │    └── RecursionError
            ├── StopAsyncIteration
            ├── StopIteration
            ├── SyntaxError
            │    └── IndentationError
            │         └── TabError
            ├── SystemError
            ├── TypeError
            ├── ValueError
            │    └── UnicodeError
            │         ├── UnicodeDecodeError
            │         ├── UnicodeEncodeError
            │         └── UnicodeTranslateError
            └── Warning
                ├── BytesWarning
                ├── DeprecationWarning
                ├── EncodingWarning
                ├── FutureWarning
                ├── ImportWarning
                ├── PendingDeprecationWarning
                ├── ResourceWarning
                ├── RuntimeWarning
                ├── SyntaxWarning
                ├── UnicodeWarning
                └── UserWarning