In diesem Tutorial erfahren Sie anhand von Beispielen, wie Sie mit Ausnahmen in Ihrem Python-Programm umgehen, indem Sie try, exception und schließlich Anweisungen verwenden.
Video: Python-Ausnahmebehandlung (versuchen Sie es… außer… endlich)
Ausnahmen in Python
Python hat viele integrierte 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. Wenn dies nicht behandelt wird, stürzt das Programm ab.
Betrachten wir zum Beispiel ein Programm, in dem wir eine Funktion haben A
, die die Funktion aufruft B
, die wiederum die Funktion aufruft C
. Wenn eine Ausnahme in der Funktion auftritt, C
aber nicht behandelt wird C
, wird die Ausnahme an B
und dann an übergeben A
.
Wenn dies nicht behandelt wird, wird eine Fehlermeldung angezeigt und unser Programm kommt plötzlich unerwartet zum Stillstand.
Ausnahmen in Python abfangen
In Python können Ausnahmen mithilfe einer try
Anweisung behandelt werden .
Die kritische Operation, die eine Ausnahme auslösen kann, wird in die try
Klausel eingefügt. Der Code, der die Ausnahmen behandelt, ist in der except
Klausel geschrieben.
Wir können also 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)
Ausgabe
Der Eintrag ist ein Ups! aufgetreten. Nächster Eintrag. Der Eintrag ist 0 Ups! aufgetreten ist. Nächster Eintrag. Der Eintrag ist 2 Der Kehrwert von 2 ist 0,5
In diesem Programm durchlaufen wir die Werte der randomList-Liste. Wie bereits erwähnt, wird der Teil, der eine Ausnahme verursachen kann, innerhalb des try
Blocks platziert.
Wenn keine Ausnahme auftritt, wird der except
Block übersprungen und der normale Fluss fortgesetzt (für den letzten Wert). Wenn jedoch eine Ausnahme auftritt, wird sie vom except
Block abgefangen (erster und zweiter Wert).
Hier drucken wir den Namen der Ausnahme mit der exc_info()
Funktion im sys
Modul. Wir können diese a
Ursachen ValueError
und 0
Ursachen sehen ZeroDivisionError
.
Da jede Ausnahme in Python von der Basisklasse erbt Exception
, können wir die obige Aufgabe auch folgendermaßen ausfü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.
Abfangen spezifischer Ausnahmen in Python
Im obigen Beispiel haben wir in der except
Klausel keine spezifische Ausnahme erwähnt .
Dies ist keine gute Programmierpraxis, da alle Ausnahmen erfasst und alle Fälle gleich behandelt werden. Wir können angeben, welche Ausnahmen eine except
Klausel abfangen soll.
Eine try
Klausel kann eine beliebige Anzahl von except
Klauseln enthalten, um verschiedene Ausnahmen zu behandeln. Im Falle einer Ausnahme wird jedoch nur eine ausgeführt.
Wir können ein Tupel von Werten verwenden, um mehrere Ausnahmen in einer Ausnahmeklausel anzugeben. Hier ist ein Beispiel für einen 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
Ausnahmen in Python auslösen
Bei der Python-Programmierung werden Ausnahmen ausgelöst, wenn zur Laufzeit Fehler auftreten. Wir können Ausnahmen auch manuell mit dem raise
Schlüsselwort auslösen.
Optional können wir 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 versuchen mit else-Klausel
In einigen Situationen möchten Sie möglicherweise einen bestimmten Codeblock ausführen, wenn der darin enthaltene Codeblock try
fehlerfrei ausgeführt wurde. In diesen Fällen können Sie das optionale else
Schlüsselwort mit der try
Anweisung verwenden.
Hinweis : Ausnahmen in der else-Klausel werden von den vorhergehenden Ausnahmen nicht behandelt.
Schauen wir uns ein Beispiel an:
# program to print the reciprocal of even numbers try: num = int(input("Enter a number: ")) assert num % 2 == 0 except: print("Not an even number!") else: reciprocal = 1/num print(reciprocal)
Ausgabe
Wenn wir eine ungerade Zahl übergeben:
Geben Sie eine Zahl ein: 1 Keine gerade Zahl!
Wenn wir eine gerade Zahl übergeben, wird der Kehrwert berechnet und angezeigt.
Geben Sie eine Zahl ein: 4 0,25
Wenn wir jedoch 0 übergeben, erhalten wir, ZeroDivisionError
da der Codeblock im Inneren else
nicht durch Vorgänger behandelt wird except
.
Enter a number: 0 Traceback (most recent call last): File "", line 7, in reciprocal = 1/num ZeroDivisionError: division by zero
Python try… finally
The try
statement in Python can have an optional finally
clause. This clause is executed no matter what, and is generally used to release external resources.
For example, we may be connected to a remote data center through the network or working with a file or a Graphical User Interface (GUI).
In all these circumstances, we must clean up the resource before the program comes to a halt whether it successfully ran or not. These actions (closing a file, GUI or disconnecting from network) are performed in the finally
clause to guarantee the execution.
Here is an example of file operations to illustrate this.
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.