Python-Ausnahmen: Eine Einführung
Ein Python-Programm wird beendet, sobald ein Fehler auftritt. In Python kann ein Fehler ein Syntaxfehler oder eine Ausnahme sein. In diesem Artikel erfahren Sie, was eine Ausnahme ist und wie sie sich von einem Syntaxfehler unterscheidet. Danach lernen Sie, wie Sie Ausnahmen auslösen und Aussagen machen. Anschließend beenden Sie eine Demonstration des Try-and-Except-Blocks.
Kostenloser PDF-Download: Python 3 Spickzettel
Ausnahmen versus Syntaxfehler
Syntaxfehler treten auf, wenn der Parser eine falsche Anweisung erkennt. Beachten Sie das folgende Beispiel:
>>> print( 0 / 0 ))
File "", line 1
print( 0 / 0 ))
^
SyntaxError: invalid syntax
Der Pfeil zeigt an, wo der Parser aufsyntax error gestoßen ist. In diesem Beispiel gab es eine Klammer zu viele. Entfernen Sie es und führen Sie Ihren Code erneut aus:
>>> print( 0 / 0)
Traceback (most recent call last):
File "", line 1, in
ZeroDivisionError: integer division or modulo by zero
Dieses Mal sind Sie aufexception error gestoßen. Diese Art von Fehler tritt immer dann auf, wenn syntaktisch korrekter Python-Code zu einem Fehler führt. In der letzten Zeile der Nachricht wurde angegeben, auf welche Art von Ausnahmefehler Sie gestoßen sind.
Anstatt die Nachrichtexception error
anzuzeigen, gibt Python an, welche Art von Ausnahmefehler aufgetreten ist. In diesem Fall war es einZeroDivisionError
. Python bietetvarious built-in exceptions sowie die Möglichkeit, selbst definierte Ausnahmen zu erstellen.
Eine Ausnahme auslösen
Wir könnenraise
verwenden, um eine Ausnahme auszulösen, wenn eine Bedingung auftritt. Die Anweisung kann durch eine benutzerdefinierte Ausnahme ergänzt werden.
Wenn Sie einen Fehler auslösen möchten, wenn eine bestimmte Bedingung mitraise
auftritt, können Sie folgendermaßen vorgehen:
x = 10
if x > 5:
raise Exception('x should not exceed 5. The value of x was: {}'.format(x))
Wenn Sie diesen Code ausführen, lautet die Ausgabe wie folgt:
Traceback (most recent call last):
File "", line 4, in
Exception: x should not exceed 5. The value of x was: 10
Das Programm kommt zum Stillstand und zeigt unsere Ausnahme vom Bildschirm an, um Hinweise darauf zu geben, was schief gelaufen ist.
DieAssertionError
-Ausnahme
Anstatt darauf zu warten, dass ein Programm auf halbem Weg abstürzt, können Sie auch mitmaking an assertion in Python beginnen. Wirassert
, dass eine bestimmte Bedingung erfüllt ist. Wenn sich herausstellt, dass diese BedingungTrue
ist, ist das ausgezeichnet! Das Programm kann fortgesetzt werden. Wenn sich herausstellt, dass die BedingungFalse
ist, kann das Programm eineAssertionError
-Ausnahme auslösen.
Schauen Sie sich das folgende Beispiel an, in dem behauptet wird, dass der Code auf einem Linux-System ausgeführt wird:
import sys
assert ('linux' in sys.platform), "This code runs on Linux only."
Wenn Sie diesen Code auf einem Linux-Computer ausführen, wird die Zusicherung bestanden. Wenn Sie diesen Code auf einem Windows-Computer ausführen würden, wäre das Ergebnis der ZusicherungFalse
und das Ergebnis wäre das Folgende:
Traceback (most recent call last):
File "", line 2, in
AssertionError: This code runs on Linux only.
In diesem Beispiel ist das Auslösen einerAssertionError
-Ausnahme das Letzte, was das Programm tun wird. Das Programm wird angehalten und nicht fortgesetzt. Was ist, wenn Sie das nicht wollen?
Der Blocktry
undexcept
: Ausnahmen behandeln
Der Blocktry
undexcept
in Python wird zum Abfangen und Behandeln von Ausnahmen verwendet. Python führt Code nach der Anweisungtry
als "normalen" Teil des Programms aus. Der Code, der auf die Anweisungexcept
folgt, ist die Antwort des Programms auf Ausnahmen in der vorhergehenden Klauseltry
.
Wie Sie bereits gesehen haben, gibt Python einen Ausnahmefehler aus, wenn syntaktisch korrekter Code auf einen Fehler stößt. Dieser Ausnahmefehler stürzt das Programm ab, wenn es nicht behandelt wird. Dieexcept
-Klausel bestimmt, wie Ihr Programm auf Ausnahmen reagiert.
Die folgende Funktion kann Ihnen helfen, den Blocktry
undexcept
zu verstehen:
def linux_interaction():
assert ('linux' in sys.platform), "Function can only run on Linux systems."
print('Doing something.')
Dielinux_interaction()
können nur auf einem Linux-System ausgeführt werden. Dieassert
in dieser Funktion lösen eineAssertionError
-Ausnahme aus, wenn Sie sie auf einem anderen Betriebssystem als Linux aufrufen.
Sie können der Funktion mit dem folgenden Code eintry
geben:
try:
linux_interaction()
except:
pass
Sie haben den Fehler hier behandelt, indem Siepass
ausgegeben haben. Wenn Sie diesen Code auf einem Windows-Computer ausführen würden, würden Sie die folgende Ausgabe erhalten:
Du hast nichts. Das Gute hier ist, dass das Programm nicht abgestürzt ist. Es wäre jedoch schön zu sehen, ob bei der Ausführung Ihres Codes eine Ausnahme aufgetreten ist. Zu diesem Zweck können Sie diepass
in etwas ändern, das eine informative Nachricht generiert, wie folgt:
try:
linux_interaction()
except:
print('Linux function was not executed')
Führen Sie diesen Code auf einem Windows-Computer aus:
Linux function was not executed
Wenn in einem Programm, in dem diese Funktion ausgeführt wird, eine Ausnahme auftritt, wird das Programm fortgesetzt und Sie darüber informiert, dass der Funktionsaufruf nicht erfolgreich war.
Was Sie nicht gesehen haben, war die Art des Fehlers, der als Ergebnis des Funktionsaufrufs ausgelöst wurde. Um genau zu sehen, was schief gelaufen ist, müssen Sie den Fehler abfangen, den die Funktion ausgelöst hat.
Der folgende Code ist ein Beispiel, in dem Sie dieAssertionError
erfassen und diese Nachricht auf dem Bildschirm ausgeben:
try:
linux_interaction()
except AssertionError as error:
print(error)
print('The linux_interaction() function was not executed')
Wenn Sie diese Funktion auf einem Windows-Computer ausführen, wird Folgendes ausgegeben:
Function can only run on Linux systems.
The linux_interaction() function was not executed
Die erste Meldung istAssertionError
und informiert Sie darüber, dass die Funktion nur auf einem Linux-Computer ausgeführt werden kann. Die zweite Meldung zeigt an, welche Funktion nicht ausgeführt wurde.
Im vorherigen Beispiel haben Sie eine Funktion aufgerufen, die Sie selbst geschrieben haben. Als Sie die Funktion ausgeführt haben, haben Sie die Ausnahme vonAssertionError
abgefangen und auf dem Bildschirm gedruckt.
Hier ist ein weiteres Beispiel, in dem Sie eine Datei öffnen und eine integrierte Ausnahme verwenden:
try:
with open('file.log') as file:
read_data = file.read()
except:
print('Could not open file.log')
Wennfile.log nicht vorhanden ist, gibt dieser Codeblock Folgendes aus:
Could not open file.log
Dies ist eine informative Nachricht, und unser Programm wird weiterhin ausgeführt. InPython docs sehen Sie, dass es viele integrierte Ausnahmen gibt, die Sie hier verwenden können. Eine auf dieser Seite beschriebene Ausnahme ist die folgende:
Ausnahme
FileNotFoundError
Wird ausgelöst, wenn eine Datei oder ein Verzeichnis angefordert wird, aber nicht vorhanden ist. Entspricht errno ENOENT.
Um diese Art von Ausnahme abzufangen und auf dem Bildschirm auszudrucken, können Sie den folgenden Code verwenden:
try:
with open('file.log') as file:
read_data = file.read()
except FileNotFoundError as fnf_error:
print(fnf_error)
In diesem Fall ist die Ausgabe wie folgt, wennfile.log nicht vorhanden ist:
[Errno 2] No such file or directory: 'file.log'
Sie können mehr als einen Funktionsaufruf in Ihrertry
-Klausel haben und verschiedene Ausnahmen abfangen. Hierbei ist zu beachten, dass der Code in dertry
-Klausel beendet wird, sobald eine Ausnahme auftritt.
Warning: Beim Abfangen vonException
werden alle Fehler ausgeblendet, auch solche, die völlig unerwartet sind. Aus diesem Grund sollten Sie die Klauseln von bareexcept
in Ihren Python-Programmen vermeiden. Stattdessen möchten Sie aufspecific exception classesverweisen, die Sie abfangen und verarbeiten möchten. Sie können mehr darüber erfahren, warum dies eine gute Idee istin this tutorial.
Schauen Sie sich den folgenden Code an. Hier rufen Sie zuerst die Funktionlinux_interaction()
auf und versuchen dann, eine Datei zu öffnen:
try:
linux_interaction()
with open('file.log') as file:
read_data = file.read()
except FileNotFoundError as fnf_error:
print(fnf_error)
except AssertionError as error:
print(error)
print('Linux linux_interaction() function was not executed')
Wenn die Datei nicht vorhanden ist, wird beim Ausführen dieses Codes auf einem Windows-Computer Folgendes ausgegeben:
Function can only run on Linux systems.
Linux linux_interaction() function was not executed
Innerhalb dertry
-Klausel sind Sie sofort auf eine Ausnahme gestoßen und sind nicht zu dem Teil gelangt, in dem Sie versuchen,file.log zu öffnen. Schauen Sie sich nun an, was passiert, wenn Sie den Code auf einem Linux-Computer ausführen:
[Errno 2] No such file or directory: 'file.log'
Hier sind die wichtigsten Imbissbuden:
-
Eine
try
-Klausel wird bis zu dem Punkt ausgeführt, an dem die erste Ausnahme auftritt. -
In der
except
-Klausel oder im Exception-Handler bestimmen Sie, wie das Programm auf die Ausnahme reagiert. -
Sie können mehrere Ausnahmen antizipieren und unterscheiden, wie das Programm darauf reagieren soll.
Dieelse
-Klausel
In Python können Sie mit der Anweisungelse
ein Programm anweisen, einen bestimmten Codeblock nur ohne Ausnahmen auszuführen.
Schauen Sie sich das folgende Beispiel an:
try:
linux_interaction()
except AssertionError as error:
print(error)
else:
print('Executing the else clause.')
Wenn Sie diesen Code auf einem Linux-System ausführen würden, wäre die Ausgabe wie folgt:
Doing something.
Executing the else clause.
Da das Programm keine Ausnahmen aufwies, wurde die Klauselelse
ausgeführt.
Sie können auchtry
ausführen, um Code innerhalb derelse
-Klausel auszuführen und mögliche Ausnahmen dort abzufangen:
try:
linux_interaction()
except AssertionError as error:
print(error)
else:
try:
with open('file.log') as file:
read_data = file.read()
except FileNotFoundError as fnf_error:
print(fnf_error)
Wenn Sie diesen Code auf einem Linux-Computer ausführen würden, würden Sie das folgende Ergebnis erhalten:
Doing something.
[Errno 2] No such file or directory: 'file.log'
An der Ausgabe können Sie sehen, dass die Funktionlinux_interaction()
ausgeführt wurde. Da keine Ausnahmen aufgetreten sind, wurde versucht,file.log zu öffnen. Diese Datei war nicht vorhanden, und anstatt die Datei zu öffnen, haben Sie die AusnahmeFileNotFoundError
abgefangen.
Aufräumen nach Verwendung vonfinally
Stellen Sie sich vor, Sie müssten immer eine Aktion implementieren, um nach der Ausführung Ihres Codes zu bereinigen. Mit Python können Sie dies mit derfinally
-Klausel tun.
Schauen Sie sich das folgende Beispiel an:
try:
linux_interaction()
except AssertionError as error:
print(error)
else:
try:
with open('file.log') as file:
read_data = file.read()
except FileNotFoundError as fnf_error:
print(fnf_error)
finally:
print('Cleaning up, irrespective of any exceptions.')
Im vorherigen Code wird alles in derfinally
-Klausel ausgeführt. Es spielt keine Rolle, ob irgendwo in den Klauselntry
oderelse
eine Ausnahme auftritt. Wenn Sie den vorherigen Code auf einem Windows-Computer ausführen, wird Folgendes ausgegeben:
Function can only run on Linux systems.
Cleaning up, irrespective of any exceptions.
Zusammenfassen
Nachdem Sie den Unterschied zwischen Syntaxfehlern und Ausnahmen erkannt haben, haben Sie verschiedene Möglichkeiten zum Auslösen, Abfangen und Behandeln von Ausnahmen in Python kennengelernt. In diesem Artikel haben Sie die folgenden Optionen gesehen:
-
Mit
raise
können Sie jederzeit eine Ausnahme auslösen. -
Mit
assert
können Sie überprüfen, ob eine bestimmte Bedingung erfüllt ist, und eine Ausnahme auslösen, wenn dies nicht der Fall ist. -
In der
try
-Klausel werden alle Anweisungen ausgeführt, bis eine Ausnahme auftritt. -
except
wird verwendet, um die in der try-Klausel auftretenden Ausnahmen abzufangen und zu behandeln. -
Mit
else
können Sie Abschnitte codieren, die nur ausgeführt werden sollen, wenn in der try-Klausel keine Ausnahmen auftreten. -
Mit
finally
können Sie Codeabschnitte ausführen, die immer ausgeführt werden sollten, mit oder ohne zuvor aufgetretene Ausnahmen.
Kostenloser PDF-Download: Python 3 Spickzettel
Hoffentlich hat Ihnen dieser Artikel geholfen, die grundlegenden Tools zu verstehen, die Python beim Umgang mit Ausnahmen bietet.