Einführung
In diesem Lab lernen Sie, wie Sie prüfen können, ob eine Funktion in Python eine Ausnahme (Exception) auslöst. Das Lab beginnt mit der Untersuchung von Ausnahmen und wie diese innerhalb von Funktionen auftreten können. Sie werden eine einfache Python-Funktion erstellen, die möglicherweise einen ZeroDivisionError auslöst, und den Rückverfolgungsbericht (Traceback) beobachten, wenn die Ausnahme auftritt.
Als Nächstes werden Sie einen try-except-Block implementieren, um die Ausnahme gracefully zu behandeln. Abschließend lernen Sie, wie Sie pytest.raises verwenden, um zu testen, ob eine Funktion eine bestimmte Ausnahme auslöst (optionale Einführung).
Untersuchen von Ausnahmen in Funktionen
In diesem Schritt lernen Sie über Ausnahmen (Exceptions) und wie diese in Python-Funktionen auftreten können. Das Verständnis von Ausnahmen ist entscheidend für das Schreiben von robustem und zuverlässigem Code. Ausnahmen sind Ereignisse, die den normalen Ablauf der Programmausführung unterbrechen. Sie können aus verschiedenen Gründen auftreten, wie z. B. ungültige Eingaben, fehlende Dateien oder Netzwerkfehler.
Beginnen wir damit, eine einfache Python-Funktion zu erstellen, die möglicherweise eine Ausnahme auslöst. Öffnen Sie den VS Code-Editor in der LabEx-Umgebung und erstellen Sie eine neue Datei namens exceptions_example.py im Verzeichnis ~/project.
## ~/project/exceptions_example.py
def divide(x, y):
return x / y
print(divide(10, 2))
print(divide(5, 0))
In diesem Code:
- Wir definieren eine Funktion namens
divide, die zwei Argumentexundynimmt und das Ergebnis der Division vonxdurchyzurückgibt. - Wir rufen zunächst die Funktion
dividemit den Argumenten10und2auf, was dazu führt, dass5.0in der Konsole ausgegeben wird. - Dann rufen wir die Funktion
dividemit den Argumenten5und0auf. Dies führt zu einemZeroDivisionError, da die Division durch Null nicht erlaubt ist.
Lassen Sie uns nun dieses Skript ausführen. Öffnen Sie das Terminal in VS Code (Sie finden es unter "View" -> "Terminal") und führen Sie den folgenden Befehl aus:
python ~/project/exceptions_example.py
Sie werden eine Ausgabe ähnlich der folgenden sehen:
5.0
Traceback (most recent call last):
File "/home/labex/project/exceptions_example.py", line 4, in <module>
print(divide(5, 0))
File "/home/labex/project/exceptions_example.py", line 2, in divide
return x / y
ZeroDivisionError: division by zero
Wie Sie sehen können, wurde die erste print-Anweisung erfolgreich ausgeführt, und das Ergebnis 5.0 wurde ausgegeben. Wenn jedoch die Funktion divide mit y = 0 aufgerufen wurde, trat ein ZeroDivisionError auf, und das Programm wurde beendet. Der Rückverfolgungsbericht (Traceback) zeigt die Abfolge der Funktionsaufrufe, die zur Ausnahme geführt haben, was für die Fehlersuche hilfreich sein kann.
Dieses Beispiel zeigt, wie Ausnahmen in Funktionen auftreten können und wie sie den normalen Ablauf eines Programms unterbrechen können. Im nächsten Schritt lernen Sie, wie Sie Ausnahmen mit try- und except-Blöcken behandeln können.
Implementieren eines try-except-Blocks
Im vorherigen Schritt haben Sie gesehen, wie Ausnahmen (Exceptions) dazu führen können, dass ein Programm abrupt beendet wird. Um Ausnahmen gracefully zu behandeln und Programmabstürze zu vermeiden, können Sie try- und except-Blöcke verwenden.
Ein try-Block ermöglicht es Ihnen, einen Codeabschnitt einzuschließen, der möglicherweise eine Ausnahme auslöst. Wenn innerhalb des try-Blocks eine Ausnahme auftritt, springt das Programm zum entsprechenden except-Block, in dem Sie die Ausnahme behandeln können.
Lassen Sie uns die Datei exceptions_example.py so ändern, dass sie einen try-except-Block enthält, um den ZeroDivisionError zu behandeln. Öffnen Sie die Datei exceptions_example.py im VS Code-Editor und ändern Sie sie wie folgt:
## ~/project/exceptions_example.py
def divide(x, y):
try:
result = x / y
return result
except ZeroDivisionError:
return "Cannot divide by zero!"
print(divide(10, 2))
print(divide(5, 0))
print(divide(8, 4))
In diesem geänderten Code:
- Wir haben einen
try-Block um die Operationx / yhinzugefügt. Dies bedeutet, dass wenn während der Division einZeroDivisionErrorauftritt, das Programm zumexcept-Block springt. - Die Zeile
except ZeroDivisionError:gibt an, dass wirZeroDivisionError-Ausnahmen behandeln möchten. - Innerhalb des
except-Blocks geben wir die Zeichenkette"Cannot divide by zero!"zurück. Diese wird in der Konsole ausgegeben, anstatt dass das Programm abstürzt.
Lassen Sie uns nun das geänderte Skript ausführen. Öffnen Sie das Terminal in VS Code und führen Sie den folgenden Befehl aus:
python ~/project/exceptions_example.py
Sie werden eine Ausgabe ähnlich der folgenden sehen:
5.0
Cannot divide by zero!
2.0
Wie Sie sehen können, stürzt das Programm nicht mehr ab, wenn Sie durch Null teilen. Stattdessen fängt der except-Block den ZeroDivisionError ab, und die Nachricht "Cannot divide by zero!" wird ausgegeben. Das Programm setzt dann die Ausführung fort, und die letzte print-Anweisung wird ebenfalls erfolgreich ausgeführt.
try-except-Blöcke können auch verwendet werden, um andere Arten von Ausnahmen zu behandeln. Beispielsweise können Sie einen try-except-Block verwenden, um TypeError-Ausnahmen zu behandeln, die auftreten können, wenn Sie einen Vorgang mit inkompatiblen Datentypen ausführen. Sie können auch mehrere except-Blöcke haben, um verschiedene Arten von Ausnahmen zu behandeln.
Im nächsten Schritt lernen Sie, wie Sie pytest verwenden können, um auf Ausnahmen zu testen.
Testen mit pytest.raises (Optionale Einführung)
In diesem optionalen Schritt erhalten Sie eine kurze Einführung in die Verwendung von pytest zum Testen auf Ausnahmen (Exceptions). pytest ist ein beliebtes Testframework für Python, das den Prozess des Schreibens und Ausführens von Tests vereinfacht.
Zunächst installieren wir pytest. Öffnen Sie das Terminal in VS Code und führen Sie den folgenden Befehl aus:
pip install pytest
Dieser Befehl lädt pytest und seine Abhängigkeiten herunter und installiert sie.
Nun erstellen wir eine Testdatei für unsere divide-Funktion. Erstellen Sie eine neue Datei namens test_exceptions.py im Verzeichnis ~/project.
## ~/project/test_exceptions.py
import pytest
from exceptions_example import divide
def test_divide_by_zero():
with pytest.raises(ZeroDivisionError):
divide(5, 0)
def test_divide_valid():
assert divide(10, 2) == 5
In diesem Code:
- Wir importieren das
pytest-Modul und diedivide-Funktion aus unsererexceptions_example.py-Datei. - Wir definieren eine Testfunktion namens
test_divide_by_zero. Diese Funktion verwendetpytest.raises, um zu überprüfen, dass der Aufruf vondivide(5, 0)einenZeroDivisionErrorauslöst. Der Blockwith pytest.raises(ZeroDivisionError):stellt sicher, dass der Test nur bestanden wird, wenn innerhalb des Blocks einZeroDivisionErrorausgelöst wird. - Wir definieren eine weitere Testfunktion namens
test_divide_valid. Diese Funktion überprüft, dass der Aufruf vondivide(10, 2)den Wert5zurückgibt.
Um die Tests auszuführen, öffnen Sie das Terminal in VS Code und führen Sie den folgenden Befehl aus:
pytest ~/project/test_exceptions.py
Sie sollten eine Ausgabe ähnlich der folgenden sehen:
============================= test session starts ==============================
platform linux -- Python 3.10.12, pytest-7.4.4, pluggy-1.3.0
rootdir: /home/labex/project
collected 2 items
test_exceptions.py .. [100%]
============================== 2 passed in 0.01s ===============================
Die Ausgabe zeigt, dass zwei Tests erfasst wurden und dass beide Tests bestanden wurden. Dies zeigt, dass unsere divide-Funktion wie erwartet funktioniert: Sie löst einen ZeroDivisionError aus, wenn durch Null geteilt wird, und gibt das richtige Ergebnis zurück, wenn durch eine von Null verschiedene Zahl geteilt wird.
Dies ist ein sehr einfaches Beispiel für die Verwendung von pytest zum Testen auf Ausnahmen. pytest hat viele andere Funktionen, die Ihnen helfen können, umfassendere und effektivere Tests zu schreiben.
Zusammenfassung
In diesem Lab beginnen Sie mit der Untersuchung von Ausnahmen (Exceptions) in Python-Funktionen. Sie lernen, dass Ausnahmen Ereignisse sind, die den normalen Ablauf eines Programms unterbrechen. Sie erstellen eine divide-Funktion, die einen ZeroDivisionError auslöst, wenn durch Null geteilt wird. Beim Ausführen des Skripts wird gezeigt, wie die Ausnahme das Programm beendet und wie ein Traceback für die Fehlersuche bereitgestellt wird.
Das Lab hebt die Wichtigkeit des Verständnisses von Ausnahmen für das Schreiben robuster Code hervor. Es zeigt ein einfaches Beispiel einer Funktion, die eine Ausnahme auslösen kann, und wie man den resultierenden Fehler und den Traceback beobachten kann, wenn die Ausnahme auftritt.



