Wie man prüft, ob eine Ausnahme in Python gefangen wurde

PythonPythonBeginner
Jetzt üben

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

Einführung

In diesem Lab lernen Sie, wie Sie in Python mithilfe verschiedener Techniken prüfen können, ob eine Ausnahme (Exception) gefangen wurde. Das Lab konzentriert sich auf die Ausnahmebehandlung, einen entscheidenden Aspekt beim Schreiben von robustem und zuverlässigem Python-Code.

Das Lab führt Sie durch das Verständnis des Ausnahmebehandlungsflusses mithilfe von try...except-Blöcken, um Fehler wie ZeroDivisionError elegant zu behandeln. Sie lernen, wie Sie innerhalb des except-Blocks eine Flagge setzen können, um anzuzeigen, dass eine Ausnahme gefangen wurde. Abschließend wird das Konzept des Einsatzes von Kontext-Managern für eine kontrolliertere Ausnahmebehandlung eingeführt.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL python(("Python")) -.-> python/ControlFlowGroup(["Control Flow"]) python(("Python")) -.-> python/ErrorandExceptionHandlingGroup(["Error and Exception Handling"]) python(("Python")) -.-> python/FileHandlingGroup(["File Handling"]) python(("Python")) -.-> python/AdvancedTopicsGroup(["Advanced Topics"]) python/ControlFlowGroup -.-> python/conditional_statements("Conditional Statements") python/ErrorandExceptionHandlingGroup -.-> python/catching_exceptions("Catching Exceptions") python/ErrorandExceptionHandlingGroup -.-> python/raising_exceptions("Raising Exceptions") python/FileHandlingGroup -.-> python/file_opening_closing("Opening and Closing Files") python/FileHandlingGroup -.-> python/file_operations("File Operations") python/AdvancedTopicsGroup -.-> python/context_managers("Context Managers") subgraph Lab Skills python/conditional_statements -.-> lab-559610{{"Wie man prüft, ob eine Ausnahme in Python gefangen wurde"}} python/catching_exceptions -.-> lab-559610{{"Wie man prüft, ob eine Ausnahme in Python gefangen wurde"}} python/raising_exceptions -.-> lab-559610{{"Wie man prüft, ob eine Ausnahme in Python gefangen wurde"}} python/file_opening_closing -.-> lab-559610{{"Wie man prüft, ob eine Ausnahme in Python gefangen wurde"}} python/file_operations -.-> lab-559610{{"Wie man prüft, ob eine Ausnahme in Python gefangen wurde"}} python/context_managers -.-> lab-559610{{"Wie man prüft, ob eine Ausnahme in Python gefangen wurde"}} end

Lernen des Ausnahmebehandlungsflusses

In diesem Schritt lernen Sie die Ausnahmebehandlung in Python kennen. Die Ausnahmebehandlung ist ein entscheidender Bestandteil beim Schreiben von robustem und zuverlässigem Code. Sie ermöglicht es Ihnen, Fehler, die während der Ausführung Ihres Programms auftreten können, elegant zu behandeln, verhindert, dass das Programm abstürzt und bietet ein benutzerfreundlicheres Erlebnis.

Beginnen wir mit einem einfachen Beispiel. Stellen Sie sich vor, Sie möchten zwei Zahlen dividieren, aber die zweite Zahl könnte null sein. Das Teilen durch null ist eine undefinierte Operation und löst in Python einen ZeroDivisionError aus.

  1. Öffnen Sie den VS Code-Editor in der LabEx-Umgebung.

  2. Erstellen Sie eine neue Datei namens division.py im Verzeichnis ~/project.

    touch ~/project/division.py
  3. Bearbeiten Sie die Datei division.py und fügen Sie den folgenden Code hinzu:

    ## division.py
    numerator = 10
    denominator = 0
    
    result = numerator / denominator
    
    print(result)
  4. Führen Sie das Skript mit dem Befehl python aus:

    python ~/project/division.py

Sie werden eine Fehlermeldung ähnlich der folgenden sehen:

Traceback (most recent call last):
  File "/home/labex/project/division.py", line 4, in <module>
    result = numerator / denominator
ZeroDivisionError: division by zero

Diese Fehlermeldung zeigt an, dass ein ZeroDivisionError aufgetreten ist, weil wir versucht haben, durch null zu teilen. Ohne Ausnahmebehandlung wird das Programm abrupt beendet.

Jetzt verwenden wir die Ausnahmebehandlung, um diesen Fehler elegant zu behandeln.

  1. Modifizieren Sie die Datei division.py, um einen try...except-Block einzufügen:

    ## division.py
    numerator = 10
    denominator = 0
    
    try:
        result = numerator / denominator
        print(result)
    except ZeroDivisionError:
        print("Error: Cannot divide by zero.")

In diesem Code enthält der try-Block den Code, der eine Ausnahme auslösen könnte. Wenn innerhalb des try-Blocks ein ZeroDivisionError auftritt, wird der Code im except-Block ausgeführt.

  1. Führen Sie das Skript erneut aus:

    python ~/project/division.py

Jetzt wird das Programm anstelle eines Absturzes folgende Ausgabe liefern:

Error: Cannot divide by zero.

Dies zeigt die grundlegende Struktur der Ausnahmebehandlung:

  • Der try-Block umschließt den Code, der eine Ausnahme auslösen könnte.
  • Der except-Block gibt den Typ der auszulösenden Ausnahme und den Code an, der ausgeführt werden soll, wenn diese Ausnahme auftritt.

Sie können auch mehrere Typen von Ausnahmen mit mehreren except-Blöcken fangen:

## division.py
numerator = 10
denominator = "abc"

try:
    result = numerator / int(denominator)
    print(result)
except ZeroDivisionError:
    print("Error: Cannot divide by zero.")
except ValueError:
    print("Error: Invalid input. Please enter a number.")

In diesem Beispiel haben wir einen ValueError-Ausnahmehandler hinzugefügt. Wenn der denominator nicht in eine Ganzzahl umgewandelt werden kann (z.B. wenn es eine Zeichenkette wie "abc" ist), wird ein ValueError ausgelöst und der entsprechende except-Block ausgeführt.

Führen Sie das Skript aus:

python ~/project/division.py

Ausgabe:

Error: Invalid input. Please enter a number.

Die Ausnahmebehandlung ermöglicht es Ihnen, robuster und benutzerfreundlichere Programme zu schreiben, indem Sie potenzielle Fehler antizipieren und behandeln.

Setzen einer Flagge im except-Block

In diesem Schritt lernen Sie, wie Sie eine Flagge innerhalb eines except-Blocks verwenden können, um den Programmfluss abhängig davon zu steuern, ob eine Ausnahme aufgetreten ist oder nicht. Dies ist eine nützliche Technik, wenn Sie je nach Ergebnis des try-Blocks unterschiedliche Aktionen ausführen müssen.

Basierend auf dem vorherigen Beispiel möchten Sie nun möglicherweise den Kehrwert einer Zahl berechnen, aber nur, wenn die Division erfolgreich war. Sie können eine Flagge verwenden, um anzuzeigen, ob die Division erfolgreich war, und dann den Kehrwert entsprechend berechnen.

  1. Öffnen Sie den VS Code-Editor in der LabEx-Umgebung.

  2. Modifizieren Sie die Datei division.py im Verzeichnis ~/project, um eine Flagge einzufügen:

    ## division.py
    numerator = 10
    denominator = 2
    success = True  ## Initialisieren Sie die Flagge auf True
    
    try:
        result = numerator / denominator
        print("Result of division:", result)
    except ZeroDivisionError:
        print("Error: Cannot divide by zero.")
        success = False  ## Setzen Sie die Flagge auf False, wenn ein Fehler auftritt
    except ValueError:
        print("Error: Invalid input. Please enter a number.")
        success = False ## Setzen Sie die Flagge auf False, wenn ein Fehler auftritt
    else:
        print("No exception occurred.")
    
    if success:
        try:
            reciprocal = 1 / result
            print("Reciprocal:", reciprocal)
        except ZeroDivisionError:
            print("Cannot calculate reciprocal of zero.")
    else:
        print("Reciprocal calculation skipped due to error.")

In diesem Code:

  • Wir initialisieren eine Flagge namens success auf True vor dem try-Block.
  • Wenn ein ZeroDivisionError oder ValueError auftritt, setzen wir die success-Flagge auf False innerhalb des entsprechenden except-Blocks.
  • Nach dem try...except-Block überprüfen wir den Wert der success-Flagge. Wenn sie immer noch True ist, bedeutet dies, dass keine Ausnahme aufgetreten ist, und wir können den Kehrwert sicher berechnen. Andernfalls überspringen wir die Kehrwertberechnung.
  • Wir haben auch einen else-Block hinzugefügt, der ausgeführt wird, wenn keine Ausnahme im try-Block auftritt.
  1. Führen Sie das Skript mit einem gültigen Divisor aus:

    python ~/project/division.py

Ausgabe:

Result of division: 5.0
No exception occurred.
Reciprocal: 0.2
  1. Ändern Sie nun den denominator auf 0 und führen Sie das Skript erneut aus:
## division.py
numerator = 10
denominator = 0 ## Ändern Sie den Divisor auf 0
success = True

try:
    result = numerator / denominator
    print("Result of division:", result)
except ZeroDivisionError:
    print("Error: Cannot divide by zero.")
    success = False
except ValueError:
    print("Error: Invalid input. Please enter a number.")
    success = False
else:
    print("No exception occurred.")

if success:
    try:
        reciprocal = 1 / result
        print("Reciprocal:", reciprocal)
    except ZeroDivisionError:
        print("Cannot calculate reciprocal of zero.")
else:
    print("Reciprocal calculation skipped due to error.")

Führen Sie das Skript aus:

python ~/project/division.py

Ausgabe:

Error: Cannot divide by zero.
Reciprocal calculation skipped due to error.

Dies zeigt, wie Sie eine Flagge im except-Block verwenden können, um den Programmfluss zu steuern und unterschiedliche Aktionen auszuführen, je nachdem, ob eine Ausnahme aufgetreten ist oder nicht.

Verwenden von Kontext-Managern zur Steuerung

In diesem Schritt lernen Sie, wie Sie in Python Kontext-Manager (Context Managers) verwenden können, um die Ausnahmebehandlung zu vereinfachen und sicherzustellen, dass Ressourcen ordnungsgemäß verwaltet werden, auch wenn Ausnahmen auftreten. Kontext-Manager sind besonders nützlich, wenn Sie mit Dateien, Netzwerkverbindungen und anderen Ressourcen arbeiten, die explizit geschlossen oder freigegeben werden müssen.

Ein Kontext-Manager ist ein Objekt, das die Methoden __enter__ und __exit__ definiert. Die with-Anweisung wird verwendet, um einen Codeblock im Kontext eines Kontext-Managers auszuführen. Die __enter__-Methode wird aufgerufen, wenn der with-Block betreten wird, und die __exit__-Methode wird aufgerufen, wenn der with-Block verlassen wird, unabhängig davon, ob eine Ausnahme aufgetreten ist.

Beginnen wir mit einem einfachen Beispiel für das Lesen einer Datei mit einem Kontext-Manager.

  1. Öffnen Sie den VS Code-Editor in der LabEx-Umgebung.

  2. Erstellen Sie eine neue Datei namens file_handling.py im Verzeichnis ~/project.

    touch ~/project/file_handling.py
  3. Bearbeiten Sie die Datei file_handling.py und fügen Sie den folgenden Code hinzu:

    ## file_handling.py
    
    filename = "my_file.txt"
    
    try:
        with open(filename, "w") as f:
            f.write("Hello, LabEx!\n")
            f.write("This is a test file.\n")
    except IOError as e:
        print(f"An I/O error occurred: {e}")
    
    try:
        with open(filename, "r") as f:
            content = f.read()
            print("File content:")
            print(content)
    except FileNotFoundError:
        print(f"The file '{filename}' was not found.")
    except IOError as e:
        print(f"An I/O error occurred: {e}")

In diesem Code:

  • Wir verwenden die Anweisung with open(filename, "w") as f:, um die Datei my_file.txt im Schreibmodus ("w") zu öffnen. Die open()-Funktion gibt ein Dateiobjekt zurück, das der Variablen f zugewiesen wird.
  • Die with-Anweisung stellt sicher, dass die Datei automatisch geschlossen wird, wenn der Block verlassen wird, auch wenn eine Ausnahme auftritt.
  • Wir schreiben zwei Zeilen Text in die Datei mit der Methode f.write().
  • Anschließend verwenden wir die Anweisung with open(filename, "r") as f:, um dieselbe Datei im Lesemodus ("r") zu öffnen.
  • Wir lesen den gesamten Inhalt der Datei mit der Methode f.read() und geben ihn auf der Konsole aus.
  • Wir umschließen die Dateioperationen in try...except-Blöcken, um potenzielle FileNotFoundError- und IOError-Ausnahmen zu behandeln.
  1. Führen Sie das Skript aus:

    python ~/project/file_handling.py

Ausgabe:

File content:
Hello, LabEx!
This is a test file.

Wenn die Datei my_file.txt nicht existiert, wird das Skript sie erstellen und den angegebenen Inhalt schreiben. Wenn die Datei bereits existiert, wird ihr Inhalt überschrieben. Die with-Anweisung stellt sicher, dass die Datei in beiden Fällen ordnungsgemäß geschlossen wird.

Betrachten wir ein weiteres Beispiel, bei dem während der Dateiverarbeitung eine Ausnahme auftreten könnte:

## file_handling.py
filename = "my_file.txt"

try:
    with open(filename, "r") as f:
        for line in f:
            ## Simulate an error during processing
            if "test" in line:
                raise ValueError("Simulated error during processing")
            print("Line:", line.strip())
except FileNotFoundError:
    print(f"The file '{filename}' was not found.")
except ValueError as e:
    print(f"A value error occurred: {e}")
except IOError as e:
    print(f"An I/O error occurred: {e}")

In diesem Beispiel simulieren wir einen Fehler, indem wir einen ValueError auslösen, wenn die Zeile das Wort "test" enthält. Auch wenn dieser Fehler auftritt, stellt die with-Anweisung sicher, dass die Datei ordnungsgemäß geschlossen wird.

Führen Sie das Skript aus:

python ~/project/file_handling.py

Ausgabe:

Line: Hello, LabEx!
A value error occurred: Simulated error during processing

Kontext-Manager bieten eine saubere und zuverlässige Möglichkeit, Ressourcen zu verwalten und Ausnahmen in Python zu behandeln. Sie stellen sicher, dass Ressourcen ordnungsgemäß freigegeben werden, auch wenn Fehler auftreten, was Ihren Code robuster und leichter wartbar macht.

Zusammenfassung

In diesem Lab beginnen Sie damit, die Ausnahmebehandlung (Exception Handling) in Python kennenzulernen, eine entscheidende Technik für das Schreiben robuster Code. Sie starten mit einem einfachen Divisionsbeispiel, das einen ZeroDivisionError auslöst, wenn durch Null geteilt wird, was dazu führt, dass das Programm beendet wird. Anschließend implementieren Sie einen try...except-Block, um den ZeroDivisionError elegant zu behandeln, so dass das Programm nicht abstürzt und stattdessen eine informative Fehlermeldung ausgibt.