Python Exception Handling Using try, except and finally statement
Table of Contents
Exceptions in Python
Python hat viele eingebaute Ausnahmen, die ausgelöst werden, wenn Ihr Programm auf einen Fehler stößt (etwas im Programm geht schief).
Wenn diese Ausnahmen auftreten, stoppt der Python-Interpreter den aktuellen Prozess und übergibt ihn an den aufrufenden Prozess, bis er verarbeitet wird. Bei Nichtbeachtung stürzt das Programm ab.
Betrachten wir zum Beispiel ein Programm mit einer Funktion A
das ruft funktion auf B
,was wiederum die Funktion aufruft C
. Wenn eine Ausnahme in der Funktion auftritt C
wird aber nicht behandelt C
, die Ausnahme geht an B
und dann zuA
.
Bei Nichtbeachtung wird eine Fehlermeldung angezeigt und unser Programm kommt plötzlich unerwartet zum Stillstand.
Catching Exceptions in Python
In Python können Ausnahmen mit a . behandelt werden try
anweisung.
Die kritische Operation, die eine Ausnahme auslösen kann, befindet sich im try
Klausel. Der Code, der die Ausnahmen behandelt, ist in der except
Klausel.
Wir können somit auswählen, welche Operationen ausgeführt werden sollen, sobald wir die Ausnahme abgefangen haben. Hier ist ein einfaches Beispiel.
# import module sys to get the type of exception import sys randomList = ['a', 0, 2] for entry in randomList: try: print("The entry is", entry) r = 1/int(entry) break except: print("Oops!", sys.exc_info()[0], "occurred.") print("Next entry.") print() print("The reciprocal of", entry, "is", r)
Output
The entry is a Oops! <class 'ValueError'> occurred. Next entry. The entry is 0 Oops! <class 'ZeroDivisionError'> occured. Next entry. The entry is 2 The reciprocal of 2 is 0.5
In diesem Programm durchlaufen wir die Werte der randomList Liste. Wie bereits erwähnt, befindet sich der Teil, der eine Ausnahme verursachen kann, innerhalb der try
block.
Wenn keine Ausnahme auftritt, wird die except
Block wird übersprungen und der normale Fluss wird fortgesetzt (für den letzten Wert). Aber wenn eine Ausnahme auftritt, wird sie vom except
block (erster und zweiter Wert).
Hier drucken wir den Namen der Ausnahme mit dem exc_info()
Funktion im Inneren sys
Modul. Wir können das sehen a
ursachen ValueError
und 0
ursachen ZeroDivisionError
.
Da jede Ausnahme in Python von der Basis Exception
Klasse können wir die obige Aufgabe auch auf folgende Weise durchführen:
# import module sys to get the type of exception import sys randomList = ['a', 0, 2] for entry in randomList: try: print("The entry is", entry) r = 1/int(entry) break except Exception as e: print("Oops!", e.__class__, "occurred.") print("Next entry.") print() print("The reciprocal of", entry, "is", r)
Dieses Programm hat die gleiche Ausgabe wie das obige Programm.
Catching Specific Exceptions in Python
Im obigen Beispiel haben wir keine spezielle Ausnahme in der except
Klausel.
Dies ist keine gute Programmierpraxis, da dadurch alle Ausnahmen abgefangen werden und jeder Fall auf die gleiche Weise behandelt wird. Wir können festlegen, welche Ausnahmen ein except
Klausel fangen sollte.
Eine try
Klausel kann eine beliebige Anzahl von except
Klauseln zur Behandlung verschiedener Ausnahmen, es wird jedoch nur eine ausgeführt, wenn eine Ausnahme auftritt.
Wir können ein Tupel von Werten verwenden, um mehrere Ausnahmen in einer except-Klausel anzugeben. Hier ist ein Beispiel für Pseudocode.
try: # do something pass except ValueError: # handle ValueError exception pass except (TypeError, ZeroDivisionError): # handle multiple exceptions # TypeError and ZeroDivisionError pass except: # handle all other exceptions pass
Raising Exceptions in Python
In der Python-Programmierung werden Exceptions ausgelöst, wenn zur Laufzeit Fehler auftreten. Wir können Ausnahmen auch manuell auslösen, indem wir die raise
Stichwort.
Wir können optional Werte an die Ausnahme übergeben, um zu klären, warum diese Ausnahme ausgelöst wurde.
>>> raise KeyboardInterrupt Traceback (most recent call last): ... KeyboardInterrupt >>> raise MemoryError("This is an argument") Traceback (most recent call last): ... MemoryError: This is an argument >>> try: ... a = int(input("Enter a positive integer: ")) ... if a <= 0: ... raise ValueError("That is not a positive number!") ... except ValueError as ve: ... print(ve) ... Enter a positive integer: -2 That is not a positive number!
Python try with else clause
In manchen Situationen möchten Sie vielleicht einen bestimmten Codeblock ausführen, wenn der Codeblock innerhalb von try
lief ohne Fehler. Für diese Fälle können Sie die optionale else
Schlüsselwort mit dem try
anweisung.
Notiz
Ausnahmen in der else-Klausel werden von den vorangehenden except-Klauseln nicht behandelt.
Schauen wir uns ein Beispiel an:
#Programm zum Drucken des Kehrwerts gerader Zahlen try: num = int(input("Eingabe einer Nummer: ")) assert num % 2 == 0 except: print("Nicht eine gerade Zahl!") else: reciprocal = 1/num print(reciprocal)
Output
Wenn wir eine ungerade Zahl übergeben:
Eingabe einer Nummer: 1 Nicht eine gerade Zahl!
Wenn wir eine gerade Zahl übergeben, wird der Kehrwert berechnet und angezeigt.
Eingabe einer Nummer: 4 0.25
Wenn wir jedoch 0 übergeben, erhalten wir ZeroDivisionError
als Codeblock im Inneren else
wird nicht durch vorangestellte except
.
Enter a number: 0 Traceback (most recent call last): File "<string>", line 7, in <module> reciprocal = 1/num ZeroDivisionError: division by zero
Python try…finally
Die try
Anweisung in Python kann eine optionale finally
Klausel. Diese Klausel wird auf jeden Fall ausgeführt und wird im Allgemeinen verwendet, um externe Ressourcen freizugeben.
Zum Beispiel können wir über das Netzwerk mit einem entfernten Datenzentrum verbunden sein oder mit einer Datei oder einer grafischen Benutzeroberfläche (GUI) arbeiten.
Unter all diesen Umständen müssen wir die Ressource bereinigen, bevor das Programm zum Stillstand kommt, unabhängig davon, ob es erfolgreich gelaufen ist oder nicht. Diese Aktionen (Schließen einer Datei, GUI oder Trennen der Verbindung zum Netzwerk) werden in der finally
Klausel, um die Ausführung zu garantieren.
Zur Veranschaulichung ist hier ein Beispiel für Dateioperationen aufgeführt.
try: f = open("test.txt",encoding = 'utf-8') # perform file operations finally: f.close()
Diese Art von Konstrukt stellt sicher, dass die Datei geschlossen wird, auch wenn während der Programmausführung eine Ausnahme auftritt.