Python - Ausnahmebehandlung

Hallo, zukünftige Python-Zauberer! Ich bin begeistert, euer Führer auf dieser spannenden Reise in die Welt der Python-Ausnahmebehandlung zu sein. Als jemand, der seit Jahren Programmieren lehrt, kann ich euch sagen, dass das Verständnis von Ausnahmen wie das Fahrradfahren mit Stützrädern ist – es mag am Anfang knifflig erscheinen, aber sobald ihr das Griffige davon habt, werdet ihr in kürzester Zeit glatt fahren!

Python - Exceptions

Was ist eine Ausnahme?

Bevor wir in die tiefe Wasser eintauchen, beginnen wir mit den Grundlagen. Stellt euch vor, ihr backt einen Kuchen (bleibt bei mir, ich verspreche euch, das hat was mit Python zu tun!). Ihr habt eure Rezeptur (eure Code), eure Zutaten (eure Daten) und seid bereit zu gehen. Aber was passiert, wenn ihr halbwegs durch den Backvorgang keine Eier mehr habt? Das ist eine Ausnahme in der Bäckerei-Welt!

In Python ist eine Ausnahme ein Fehler, der während der Ausführung eines Programms auftritt. Es ist wie ein rotes Schild, das aufplopt und sagt: "Whoa there! Something's not quite right!" (dt.: "Puh, da stimmt was nicht!")

Sehen wir uns ein einfaches Beispiel an:

print(10 / 0)

Wenn ihr diesen Code ausführt, wird Python einen ZeroDivisionError auslösen. Es sagt: "Hey, du kannst nicht durch null teilen! Das ist in meiner Küche nicht erlaubt... Ich meine, in der Programmierumgebung!"

Ausnahmebehandlung in Python

Jetzt, da wir wissen, was Ausnahmen sind, lernen wir, wie wir sie elegant handhaben können. In Python verwenden wir die try- und except-Blöcke, um Ausnahmen abzufangen und zu behandeln.

Hier ist die grundlegende Struktur:

try:
# Code, der eine Ausnahme auslösen könnte
except AusnahmeTyp:
# Code, um die Ausnahme zu behandeln

Verändern wir unser vorheriges Beispiel:

try:
ergebnis = 10 / 0
print(ergebnis)
except ZeroDivisionError:
print("Hoppla! Du kannst nicht durch null teilen.")

Wenn ihr diesen Code ausführt, wird er nicht abstürzen, sondern ausgeben: "Hoppla! Du kannst nicht durch null teilen."

Der except-Zweig ohne Ausnahmen

Manchmal möchtet ihr vielleicht jede Ausnahme fangen, die auftritt. In diesem Fall könnt ihr einen except-Zweig ohne Angabe eines Ausnahme-Typs verwenden:

try:
# Einige riskante Code
x = int(input("Gib eine Zahl ein: "))
y = 10 / x
print(y)
except:
print("Etwas ist schiefgelaufen!")

Dies wird jede Ausnahme fangen, die im try-Block auftritt. Allerdings ist es im Allgemeinen besser, spezifische Ausnahmen zu fangen, wenn möglich, da dies euren Code präziser und einfacher zu debuggen macht.

Der except-Zweig mit mehreren Ausnahmen

Ihr könnt auch mehrere Ausnahmen in einem einzigen except-Zweig behandeln:

try:
x = int(input("Gib eine Zahl ein: "))
y = 10 / x
print(y)
except (ValueError, ZeroDivisionError):
print("Ungültige Eingabe oder Division durch null!")

Dieser Code wird sowohl ValueError (wenn der Benutzer eine nicht numerische Wert eingibt) als auch ZeroDivisionError fangen.

Der try-finally-Zweig

Der finally-Zweig wird für Code verwendet, der unabhängig davon ausgeführt werden muss, ob eine Ausnahme auftritt oder nicht. Es ist wie das Aufräumdienst-Team nach einer Party – es kommt immer, egal wie die Party verlaufen ist!

try:
f = open("beispiel.txt", "r")
# Führe einige Operationen auf der Datei durch
except FileNotFoundError:
print("Die Datei existiert nicht!")
finally:
f.close()  # Dies wird immer ausgeführt, auch wenn eine Ausnahme auftritt

Argument einer Ausnahme

Ausnahmen können zusätzliche Informationen tragen. Ihr könnt auf diese Informationen in eurem except-Block zugreifen:

try:
x = 10 / 0
except ZeroDivisionError as e:
print(f"Ein Fehler ist aufgetreten: {e}")

Dies wird ausgeben: "Ein Fehler ist aufgetreten: division by zero" (dt.: "Ein Fehler ist aufgetreten: Division durch null")

Eine Ausnahme auslösen

Manchmal möchtet ihr vielleicht selbst eine Ausnahme auslösen. Es ist wie der Schiedsrichter in einem Spiel, der eine Foule ruft:

def pruefe_alter(alter):
if alter < 0:
raise ValueError("Das Alter kann nicht negativ sein!")
print(f"Dein Alter ist {alter}")

try:
pruefe_alter(-5)
except ValueError as e:
print(e)

Dies wird ausgeben: "Das Alter kann nicht negativ sein!"

Benutzerdefinierte Ausnahmen

Ihr könnt auch eure eigenen Ausnahme-Typen erstellen. Es ist wie die Erfindung einer neuen Regel in einem Spiel:

class ZuVielePizzenFehler(Exception):
pass

def pizze_bestellen(anzahl):
if anzahl > 100:
raise ZuVielePizzenFehler("Du kannst nicht mehr als 100 Pizzen bestellen!")
print(f"Bestellung für {anzahl} Pizzen erfolgreich platziert.")

try:
pizze_bestellen(101)
except ZuVielePizzenFehler as e:
print(e)

Assertions in Python

Assertions sind eine Möglichkeit, sicherzustellen, dass bestimmte Bedingungen erfüllt sind. Sie sind wie kleine Checkpoints in eurem Code:

def teile(a, b):
assert b != 0, "Der Divisor kann nicht null sein!"
return a / b

try:
ergebnis = teile(10, 0)
except AssertionError as e:
print(e)

Dies wird ausgeben: "Der Divisor kann nicht null sein!"

Standardausnahmen

Python kommt mit einer Reihe von eingebauten Ausnahmen. Hier sind einige der häufigsten:

Ausnahme Name Beschreibung
ZeroDivisionError Wird ausgelöst, wenn eine Division oder Modulo durch null erfolgt
ValueError Wird ausgelöst, wenn eine Funktion ein Argument vom richtigen Typ, aber einem falschen Wert erhält
TypeError Wird ausgelöst, wenn eine Operation oder Funktion auf einem Objekt eines ungeeigneten Typs angewendet wird
NameError Wird ausgelöst, wenn ein lokaler oder globaler Name nicht gefunden wird
FileNotFoundError Wird ausgelöst, wenn eine Datei oder ein Verzeichnis angefordert wird, aber nicht existiert
IndexError Wird ausgelöst, wenn eine Sequenz-Subskript ausserhalb des Bereichs ist
KeyError Wird ausgelöst, wenn ein Dictionary-Schlüssel nicht gefunden wird
ImportError Wird ausgelöst, wenn eine Importanweisung fehlschlägt

Und da habt ihr es, Freunde! Ihr habt gerade euren Crashkurs in der Python-Ausnahmebehandlung abgeschlossen. Erinnert euch, Ausnahmen sind nicht eure Feinde – sie sind eher wie hilfreiche Wegweiser, die euch zu besserem, robusterem Code führen. Übt weiter, experimentiert und bald werdet ihr Ausnahmen wie ein Profi behandeln. Happy coding! (dt.: "Viel Spaß beim Coden!")

Credits: Image by storyset