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.
Lernen Sie den Ablauf der Ausnahmebehandlung (Exception Handling)
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.
Öffnen Sie den VS Code-Editor in der LabEx-Umgebung.
Erstellen Sie eine neue Datei namens
division.pyim Verzeichnis~/project.touch ~/project/division.pyBearbeiten Sie die Datei
division.pyund fügen Sie den folgenden Code hinzu:## division.py numerator = 10 denominator = 0 result = numerator / denominator print(result)Führen Sie das Skript mit dem Befehl
pythonaus: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.
Modifizieren Sie die Datei
division.py, um einentry...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.
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 Sie eine Flagge (Flag) 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.
Öffnen Sie den VS Code-Editor in der LabEx-Umgebung.
Modifizieren Sie die Datei
division.pyim 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
successaufTruevor demtry-Block. - Wenn ein
ZeroDivisionErroroderValueErrorauftritt, setzen wir diesuccess-Flagge aufFalseinnerhalb des entsprechendenexcept-Blocks. - Nach dem
try...except-Block überprüfen wir den Wert dersuccess-Flagge. Wenn sie immer nochTrueist, 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 imtry-Block auftritt.
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
- Ändern Sie nun den
denominatorauf0und 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 Sie Context Manager 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.
Öffnen Sie den VS Code-Editor in der LabEx-Umgebung.
Erstellen Sie eine neue Datei namens
file_handling.pyim Verzeichnis~/project.touch ~/project/file_handling.pyBearbeiten Sie die Datei
file_handling.pyund 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 Dateimy_file.txtim Schreibmodus ("w") zu öffnen. Dieopen()-Funktion gibt ein Dateiobjekt zurück, das der Variablenfzugewiesen 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 potenzielleFileNotFoundError- undIOError-Ausnahmen zu behandeln.
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.



