Python-Ausnahmen: Eine Einführung

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.

An introduction to exceptions in Python

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.

Illustration of raise statement usage

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.

Python assert statement

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 Anweisungtryals "normalen" Teil des Programms aus. Der Code, der auf die Anweisungexceptfolgt, ist die Antwort des Programms auf Ausnahmen in der vorhergehenden Klauseltry.

Diagram showing try and except statements

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 dieAssertionErrorerfassen 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 vonAssertionErrorabgefangen 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:

AusnahmeFileNotFoundError

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 bareexceptin 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:

  • Einetry-Klausel wird bis zu dem Punkt ausgeführt, an dem die erste Ausnahme auftritt.

  • In derexcept-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.

  • Vermeiden Sie die Verwendung von bloßenexcept-Klauseln.

Dieelse-Klausel

In Python können Sie mit der Anweisungelse ein Programm anweisen, einen bestimmten Codeblock nur ohne Ausnahmen auszuführen.

Diagram of try

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 AusnahmeFileNotFoundErrorabgefangen.

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.

Diagram explaining try except else finally statements

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:

  • Mitraise können Sie jederzeit eine Ausnahme auslösen.

  • Mitassert können Sie überprüfen, ob eine bestimmte Bedingung erfüllt ist, und eine Ausnahme auslösen, wenn dies nicht der Fall ist.

  • In dertry-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.

  • Mitelse können Sie Abschnitte codieren, die nur ausgeführt werden sollen, wenn in der try-Klausel keine Ausnahmen auftreten.

  • Mitfinally 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.