Ausnahmen mit try-except in Python behandeln

PythonPythonBeginner
Jetzt üben

💡 Dieser Artikel wurde von AI-Assistenten übersetzt. Um die englische Version anzuzeigen, können Sie hier klicken

Einleitung

In diesem Lab lernen Sie, wie Sie Ausnahmen in Python mithilfe der try...except-Anweisung effektiv behandeln. Wir werden untersuchen, wie Sie spezifische Ausnahmen wie ValueError abfangen, mehrere Ausnahmetypen behandeln und Code unabhängig davon ausführen, ob eine Ausnahme aufgetreten ist, mithilfe von else- und finally-Blöcken. Sie lernen auch, wie Sie benutzerdefinierte Ausnahmen auslösen, um spezifische Fehlerbedingungen in Ihrem Code zu signalisieren. Durch praktische Übungen sammeln Sie praktische Erfahrungen im Schreiben robuster und fehlertoleranter Python-Programme.

ValueError mit try except behandeln

In diesem Schritt lernen wir, wie Sie ValueError mithilfe der try...except-Anweisung in Python behandeln. Ein ValueError tritt auf, wenn eine Funktion ein Argument vom richtigen Typ, aber mit einem ungeeigneten Wert erhält. Ein gängiges Beispiel ist der Versuch, eine Zeichenkette, die keine gültige Zahl ist, mit int() in eine Ganzzahl umzuwandeln.

Wir erstellen ein Python-Skript, das den Benutzer zur Eingabe auffordert und versucht, diese in eine Ganzzahl umzuwandeln. Wenn die Eingabe keine gültige Ganzzahl ist, fangen wir den ValueError ab und geben dem Benutzer eine freundliche Nachricht.

Öffnen Sie das integrierte Terminal in der WebIDE und navigieren Sie zum Verzeichnis ~/project, falls Sie sich nicht bereits dort befinden.

Erstellen Sie nun eine neue Python-Datei namens handle_value_error.py im Verzeichnis ~/project mithilfe des Dateiexplorers der WebIDE oder der Kommandozeile.

Öffnen Sie die Datei ~/project/handle_value_error.py im Editor der WebIDE und fügen Sie den folgenden Code hinzu:

while True:
    try:
        x = int(input('Bitte geben Sie eine Ganzzahl ein: '))
        print(f'Sie haben eingegeben: {x}')
        break
    except ValueError:
        print('Das war keine gültige Ganzzahl. Bitte versuchen Sie es erneut.')

Speichern Sie die Datei.

Führen Sie das Skript nun über das Terminal mit dem Befehl python aus:

python ~/project/handle_value_error.py

Das Skript fordert Sie auf, eine Ganzzahl einzugeben. Versuchen Sie zuerst, einen Wert einzugeben, der keine Ganzzahl ist, z. B. hello, und beobachten Sie die Ausgabe. Führen Sie das Skript dann erneut aus und geben Sie eine gültige Ganzzahl ein, um die erfolgreiche Ausführung zu sehen.

Bitte geben Sie eine Ganzzahl ein: hello
Das war keine gültige Ganzzahl. Bitte versuchen Sie es erneut.
Bitte geben Sie eine Ganzzahl ein: 123
Sie haben eingegeben: 123

In diesem Code:

  • Die while True:-Schleife fordert den Benutzer so lange zur Eingabe auf, bis eine gültige Eingabe erfolgt.
  • Der try-Block enthält den Code, der eine Ausnahme auslösen könnte, in diesem Fall den Aufruf int(input(...)).
  • Wenn während der Ausführung des try-Blocks ein ValueError auftritt, wird der Code im Block except ValueError: ausgeführt.
  • Wenn kein ValueError auftritt, wird die Zeile print(f'Sie haben eingegeben: {x}') ausgeführt und die break-Anweisung beendet die Schleife.

Dies zeigt, wie try...except ValueError es uns ermöglicht, ungültige Eingaben ordnungsgemäß zu behandeln, ohne das Programm abstürzen zu lassen.

Mehrere Ausnahmen mit try except behandeln

Im vorherigen Schritt haben wir einen einzigen Ausnahmetyp, ValueError, behandelt. Ein Codeblock kann jedoch potenziell verschiedene Arten von Ausnahmen auslösen. Python ermöglicht es Ihnen, mehrere Ausnahmen mithilfe mehrerer except-Klauseln oder durch Gruppierung von Ausnahmen in einem Tupel zu behandeln.

Erstellen wir ein neues Python-Skript, das versucht, eine Division durchzuführen. Diese Operation kann potenziell zwei gängige Ausnahmen auslösen: ValueError (wenn die Eingabe keine Zahl ist) und ZeroDivisionError (wenn der Divisor Null ist).

Öffnen Sie das integrierte Terminal und stellen Sie sicher, dass Sie sich im Verzeichnis ~/project befinden.

Erstellen Sie eine neue Python-Datei namens handle_multiple_exceptions.py im Verzeichnis ~/project.

Öffnen Sie ~/project/handle_multiple_exceptions.py im Editor der WebIDE und fügen Sie den folgenden Code hinzu:

try:
    numerator = int(input("Geben Sie den Zähler ein: "))
    denominator = int(input("Geben Sie den Nenner ein: "))
    result = numerator / denominator
    print(f"Ergebnis: {result}")
except ValueError:
    print("Ungültige Eingabe. Bitte geben Sie nur Ganzzahlen ein.")
except ZeroDivisionError:
    print("Fehler: Division durch Null ist nicht erlaubt.")

Speichern Sie die Datei.

Führen Sie das Skript nun über das Terminal aus:

python ~/project/handle_multiple_exceptions.py

Versuchen Sie, das Skript mehrmals mit unterschiedlichen Eingaben auszuführen, um zu sehen, wie es verschiedene Ausnahmen behandelt:

  1. Geben Sie für den Zähler oder Nenner nicht-ganzzahlige Werte ein (z. B. abc).
  2. Geben Sie 0 für den Nenner ein.
  3. Geben Sie für beide gültige Ganzzahlen ein.

Beispielausführungen:

Geben Sie den Zähler ein: 10
Geben Sie den Nenner ein: abc
Ungültige Eingabe. Bitte geben Sie nur Ganzzahlen ein.
Geben Sie den Zähler ein: 10
Geben Sie den Nenner ein: 0
Fehler: Division durch Null ist nicht erlaubt.
Geben Sie den Zähler ein: 10
Geben Sie den Nenner ein: 2
Ergebnis: 5.0

In diesem Beispiel haben wir zwei except-Blöcke, einen für ValueError und einen für ZeroDivisionError. Wenn im try-Block eine Ausnahme auftritt, prüft Python die except-Klauseln der Reihe nach. Die erste except-Klausel, die mit dem Ausnahmetyp übereinstimmt, wird ausgeführt.

Alternativ können Sie mehrere Ausnahmen mit einer einzigen except-Klausel behandeln, indem Sie ein Tupel von Ausnahmetypen angeben:

try:
    numerator = int(input("Geben Sie den Zähler ein: "))
    denominator = int(input("Geben Sie den Nenner ein: "))
    result = numerator / denominator
    print(f"Ergebnis: {result}")
except (ValueError, ZeroDivisionError):
    print("Ein Fehler ist aufgetreten: Ungültige Eingabe oder Division durch Null.")

Dieser Ansatz ist nützlich, wenn Sie für mehrere Ausnahmetypen die gleiche Aktion ausführen möchten.

Aktualisieren Sie die Datei ~/project/handle_multiple_exceptions.py mit der zweiten Version des Codes, die ein Tupel zur Behandlung beider Ausnahmen verwendet. Speichern Sie die Datei und führen Sie sie erneut aus, um die kombinierte Fehlermeldung zu beobachten.

Code nach try mit else ausführen

Zusätzlich zu try und except kann die try-Anweisung auch eine optionale else-Klausel enthalten. Der else-Block wird nur ausgeführt, wenn der Code im try-Block ohne Auslösen von Ausnahmen ausgeführt wird. Dies ist ein guter Ort, um Code zu platzieren, der nur ausgeführt werden soll, wenn der try-Block erfolgreich ist.

Lassen Sie uns unser vorheriges Divisionsbeispiel ändern, um einen else-Block einzufügen.

Öffnen Sie das integrierte Terminal und stellen Sie sicher, dass Sie sich im Verzeichnis ~/project befinden.

Erstellen Sie eine neue Python-Datei namens try_except_else.py im Verzeichnis ~/project.

Öffnen Sie ~/project/try_except_else.py im Editor der WebIDE und fügen Sie den folgenden Code hinzu:

try:
    numerator = int(input("Geben Sie den Zähler ein: "))
    denominator = int(input("Geben Sie den Nenner ein: "))
    result = numerator / denominator
except (ValueError, ZeroDivisionError):
    print("Ein Fehler ist aufgetreten: Ungültige Eingabe oder Division durch Null.")
else:
    print("Division erfolgreich!")
    print(f"Ergebnis: {result}")

Speichern Sie die Datei.

Führen Sie das Skript nun über das Terminal aus:

python ~/project/try_except_else.py

Führen Sie das Skript mit unterschiedlichen Eingaben aus:

  1. Geben Sie nicht-ganzzahlige Werte oder 0 für den Nenner ein, um eine Ausnahme auszulösen.
  2. Geben Sie für Zähler und Nenner gültige Ganzzahlen ein, um den else-Block auszuführen.

Beispielausführungen:

Geben Sie den Zähler ein: 10
Geben Sie den Nenner ein: 0
Ein Fehler ist aufgetreten: Ungültige Eingabe oder Division durch Null.
Geben Sie den Zähler ein: 10
Geben Sie den Nenner ein: 2
Division erfolgreich!
Ergebnis: 5.0

Beachten Sie, dass der Code im else-Block (print("Division erfolgreich!") und print(f"Ergebnis: {result}")) nur ausgeführt wird, wenn der try-Block ohne Ausnahmen abgeschlossen wird. Wenn eine Ausnahme auftritt, wird der entsprechende except-Block ausgeführt und der else-Block übersprungen.

Die else-Klausel ist eine saubere Möglichkeit, Code, der nur bei Erfolg ausgeführt werden soll, vom Fehlerbehandlungscode zu trennen.

Codeausführung mit finally sicherstellen

Die try-Anweisung in Python hat auch eine optionale finally-Klausel. Der Code innerhalb des finally-Blocks wird immer ausgeführt, unabhängig davon, ob im try-Block eine Ausnahme aufgetreten ist oder nicht. Dies ist nützlich für Bereinigungsaktionen, die unter allen Umständen durchgeführt werden müssen, wie z. B. das Schließen von Dateien oder Netzwerkverbindungen.

Fügen wir unserem Divisionsbeispiel einen finally-Block hinzu.

Öffnen Sie das integrierte Terminal und stellen Sie sicher, dass Sie sich im Verzeichnis ~/project befinden.

Erstellen Sie eine neue Python-Datei namens try_except_finally.py im Verzeichnis ~/project.

Öffnen Sie ~/project/try_except_finally.py im Editor der WebIDE und fügen Sie den folgenden Code hinzu:

try:
    numerator = int(input("Geben Sie den Zähler ein: "))
    denominator = int(input("Geben Sie den Nenner ein: "))
    result = numerator / denominator
    print(f"Ergebnis: {result}")
except (ValueError, ZeroDivisionError):
    print("Ein Fehler ist aufgetreten: Ungültige Eingabe oder Division durch Null.")
finally:
    print("Ausführung beendet.")

Speichern Sie die Datei.

Führen Sie das Skript nun über das Terminal aus:

python ~/project/try_except_finally.py

Führen Sie das Skript mit unterschiedlichen Eingaben aus:

  1. Geben Sie nicht-ganzzahlige Werte oder 0 für den Nenner ein, um eine Ausnahme auszulösen.
  2. Geben Sie für Zähler und Nenner gültige Ganzzahlen ein.

Beispielausführungen:

Geben Sie den Zähler ein: 10
Geben Sie den Nenner ein: 0
Ein Fehler ist aufgetreten: Ungültige Eingabe oder Division durch Null.
Ausführung beendet.
Geben Sie den Zähler ein: 10
Geben Sie den Nenner ein: 2
Ergebnis: 5.0
Ausführung beendet.

Beachten Sie, dass die Meldung "Ausführung beendet." aus dem finally-Block in beiden Fällen ausgegeben wird, unabhängig davon, ob eine Ausnahme aufgetreten ist oder nicht.

Der finally-Block wird garantiert ausgeführt, auch wenn sich eine return-Anweisung im try- oder except-Block befindet. Dies macht ihn ideal, um sicherzustellen, dass Ressourcen ordnungsgemäß freigegeben werden.

Benutzerdefinierte Ausnahmen auslösen

Manchmal müssen Sie signalisieren, dass in Ihrem Code ein Fehler oder eine außergewöhnliche Bedingung aufgetreten ist, auch wenn keine integrierte Ausnahme ausgelöst wurde. Dies können Sie mit der raise-Anweisung tun. Die raise-Anweisung ermöglicht es Ihnen, das Auftreten einer bestimmten Ausnahme zu erzwingen.

Sie können integrierte Ausnahmen auslösen oder sogar Ihre eigenen benutzerdefinierten Ausnahmen definieren und auslösen. Benutzerdefinierte Ausnahmen sind nützlich, um spezifischere und informativere Fehlertypen für Ihre Anwendungen zu erstellen.

Erstellen wir ein einfaches Skript, das eine integrierte Ausnahme auslöst, und dann ein weiteres Skript, das eine benutzerdefinierte Ausnahme definiert und auslöst.

Öffnen Sie das integrierte Terminal und stellen Sie sicher, dass Sie sich im Verzeichnis ~/project befinden.

Erstellen Sie eine neue Python-Datei namens raise_exception.py im Verzeichnis ~/project.

Öffnen Sie ~/project/raise_exception.py im Editor der WebIDE und fügen Sie den folgenden Code hinzu:

def check_positive(number):
    if number <= 0:
        raise ValueError("Input must be a positive number")
    print(f"The number {number} is positive.")

try:
    check_positive(-5)
except ValueError as e:
    print(f"Caught an exception: {e}")

try:
    check_positive(10)
except ValueError as e:
    print(f"Caught an exception: {e}")

Speichern Sie die Datei.

Führen Sie das Skript nun über das Terminal aus:

python ~/project/raise_exception.py

Beispielausgabe:

Caught an exception: Input must be a positive number
The number 10 is positive.

In diesem Beispiel löst die Funktion check_positive einen ValueError aus, wenn die eingegebene Zahl nicht positiv ist. Die try...except-Blöcke zeigen, wie diese Funktion aufgerufen und die ausgelöste Ausnahme abgefangen wird.

Erstellen wir nun eine benutzerdefinierte Ausnahme. Benutzerdefinierte Ausnahmen werden typischerweise als Klassen definiert, die von der integrierten Exception-Klasse oder einer ihrer Unterklassen erben.

Erstellen Sie eine neue Python-Datei namens custom_exception.py im Verzeichnis ~/project.

Öffnen Sie ~/project/custom_exception.py im Editor der WebIDE und fügen Sie den folgenden Code hinzu:

class NegativeNumberError(Exception):
    """Custom exception raised for negative numbers."""
    pass

def process_positive_number(number):
    if number < 0:
        raise NegativeNumberError("Negative numbers are not allowed")
    print(f"Processing positive number: {number}")

try:
    process_positive_number(-10)
except NegativeNumberError as e:
    print(f"Caught custom exception: {e}")

try:
    process_positive_number(20)
except NegativeNumberError as e:
    print(f"Caught custom exception: {e}")

Speichern Sie die Datei.

Führen Sie das Skript nun über das Terminal aus:

python ~/project/custom_exception.py

Beispielausgabe:

Caught custom exception: Negative numbers are not allowed
Processing positive number: 20

Hier haben wir eine benutzerdefinierte Ausnahmeklasse NegativeNumberError definiert. Die Funktion process_positive_number löst diese benutzerdefinierte Ausnahme aus, wenn sie auf eine negative Zahl stößt. Der try...except-Block fängt speziell NegativeNumberError ab.

Sie können raise auch ohne Angabe einer Ausnahme innerhalb eines except-Blocks verwenden, um die gerade abgefangene Ausnahme erneut auszulösen. Dies ist nützlich, wenn Sie eine Ausnahme teilweise behandeln und sie dann weiter im Aufrufstapel propagieren lassen möchten.

Zusammenfassung

In diesem Lab haben wir gelernt, wie man Ausnahmen in Python mit der try...except-Anweisung behandelt. Wir begannen damit, einen spezifischen ValueError zu behandeln, der auftritt, wenn versucht wird, ungültige Eingaben in eine Ganzzahl umzuwandeln, und demonstrierten, wie Benutzerfehler elegant behandelt und nach gültigen Eingaben gefragt werden kann.

Anschließend untersuchten wir die Behandlung mehrerer Ausnahmen innerhalb eines einzelnen try...except-Blocks, was es ermöglicht, verschiedene Fehlertypen abzufangen und entsprechend zu verarbeiten. Wir lernten auch, wie Code nach einem erfolgreichen try-Block mit der else-Klausel ausgeführt wird und wie sichergestellt wird, dass Code unabhängig davon ausgeführt wird, ob eine Ausnahme aufgetreten ist, mithilfe des finally-Blocks. Schließlich behandelten wir das Auslösen benutzerdefinierter Ausnahmen, um spezifische Fehlerbedingungen in unserem eigenen Code zu signalisieren.