Wie man prüft, ob eine Funktion in Python eine Ausnahme auslöst

PythonPythonBeginner
Jetzt üben

💡 Dieser Artikel wurde von AI-Assistenten übersetzt. Um die englische Version anzuzeigen, können Sie hier klicken

Einführung

In diesem Lab lernen Sie, wie Sie prüfen können, ob eine Funktion in Python eine Ausnahme (Exception) auslöst. Das Lab beginnt mit der Untersuchung von Ausnahmen und wie diese innerhalb von Funktionen auftreten können. Sie werden eine einfache Python-Funktion erstellen, die möglicherweise einen ZeroDivisionError auslöst, und den Rückverfolgungsbericht (Traceback) beobachten, wenn die Ausnahme auftritt.

Als Nächstes werden Sie einen try-except-Block implementieren, um die Ausnahme gracefully zu behandeln. Abschließend lernen Sie, wie Sie pytest.raises verwenden, um zu testen, ob eine Funktion eine bestimmte Ausnahme auslöst (optionale Einführung).


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL python(("Python")) -.-> python/ErrorandExceptionHandlingGroup(["Error and Exception Handling"]) python/ErrorandExceptionHandlingGroup -.-> python/catching_exceptions("Catching Exceptions") python/ErrorandExceptionHandlingGroup -.-> python/raising_exceptions("Raising Exceptions") subgraph Lab Skills python/catching_exceptions -.-> lab-559520{{"Wie man prüft, ob eine Funktion in Python eine Ausnahme auslöst"}} python/raising_exceptions -.-> lab-559520{{"Wie man prüft, ob eine Funktion in Python eine Ausnahme auslöst"}} end

Untersuchung von Ausnahmen in Funktionen

In diesem Schritt lernen Sie über Ausnahmen (Exceptions) und wie diese in Python-Funktionen auftreten können. Das Verständnis von Ausnahmen ist entscheidend für das Schreiben von robustem und zuverlässigem Code. Ausnahmen sind Ereignisse, die den normalen Ablauf der Programmausführung unterbrechen. Sie können aus verschiedenen Gründen auftreten, wie z. B. ungültige Eingaben, fehlende Dateien oder Netzwerkfehler.

Beginnen wir damit, eine einfache Python-Funktion zu erstellen, die möglicherweise eine Ausnahme auslöst. Öffnen Sie den VS Code-Editor in der LabEx-Umgebung und erstellen Sie eine neue Datei namens exceptions_example.py im Verzeichnis ~/project.

## ~/project/exceptions_example.py
def divide(x, y):
    return x / y

print(divide(10, 2))
print(divide(5, 0))

In diesem Code:

  • Wir definieren eine Funktion namens divide, die zwei Argumente x und y nimmt und das Ergebnis der Division von x durch y zurückgibt.
  • Wir rufen zunächst die Funktion divide mit den Argumenten 10 und 2 auf, was dazu führt, dass 5.0 in der Konsole ausgegeben wird.
  • Dann rufen wir die Funktion divide mit den Argumenten 5 und 0 auf. Dies führt zu einem ZeroDivisionError, da die Division durch Null nicht erlaubt ist.

Lassen Sie uns nun dieses Skript ausführen. Öffnen Sie das Terminal in VS Code (Sie finden es unter "View" -> "Terminal") und führen Sie den folgenden Befehl aus:

python ~/project/exceptions_example.py

Sie werden eine Ausgabe ähnlich der folgenden sehen:

5.0
Traceback (most recent call last):
  File "/home/labex/project/exceptions_example.py", line 4, in <module>
    print(divide(5, 0))
  File "/home/labex/project/exceptions_example.py", line 2, in divide
    return x / y
ZeroDivisionError: division by zero

Wie Sie sehen können, wurde die erste print-Anweisung erfolgreich ausgeführt, und das Ergebnis 5.0 wurde ausgegeben. Wenn jedoch die Funktion divide mit y = 0 aufgerufen wurde, trat ein ZeroDivisionError auf, und das Programm wurde beendet. Der Rückverfolgungsbericht (Traceback) zeigt die Abfolge der Funktionsaufrufe, die zur Ausnahme geführt haben, was für die Fehlersuche hilfreich sein kann.

Dieses Beispiel zeigt, wie Ausnahmen in Funktionen auftreten können und wie sie den normalen Ablauf eines Programms unterbrechen können. Im nächsten Schritt lernen Sie, wie Sie Ausnahmen mit try- und except-Blöcken behandeln können.

Implementierung eines try-except-Blocks

Im vorherigen Schritt haben Sie gesehen, wie Ausnahmen (Exceptions) dazu führen können, dass ein Programm abrupt beendet wird. Um Ausnahmen gracefully zu behandeln und Programmabstürze zu vermeiden, können Sie try- und except-Blöcke verwenden.

Ein try-Block ermöglicht es Ihnen, einen Codeabschnitt einzuschließen, der möglicherweise eine Ausnahme auslöst. Wenn innerhalb des try-Blocks eine Ausnahme auftritt, springt das Programm zum entsprechenden except-Block, in dem Sie die Ausnahme behandeln können.

Lassen Sie uns die Datei exceptions_example.py so ändern, dass sie einen try-except-Block enthält, um den ZeroDivisionError zu behandeln. Öffnen Sie die Datei exceptions_example.py im VS Code-Editor und ändern Sie sie wie folgt:

## ~/project/exceptions_example.py
def divide(x, y):
    try:
        result = x / y
        return result
    except ZeroDivisionError:
        return "Cannot divide by zero!"

print(divide(10, 2))
print(divide(5, 0))
print(divide(8, 4))

In diesem geänderten Code:

  • Wir haben einen try-Block um die Operation x / y hinzugefügt. Dies bedeutet, dass wenn während der Division ein ZeroDivisionError auftritt, das Programm zum except-Block springt.
  • Die Zeile except ZeroDivisionError: gibt an, dass wir ZeroDivisionError-Ausnahmen behandeln möchten.
  • Innerhalb des except-Blocks geben wir die Zeichenkette "Cannot divide by zero!" zurück. Diese wird in der Konsole ausgegeben, anstatt dass das Programm abstürzt.

Lassen Sie uns nun das geänderte Skript ausführen. Öffnen Sie das Terminal in VS Code und führen Sie den folgenden Befehl aus:

python ~/project/exceptions_example.py

Sie werden eine Ausgabe ähnlich der folgenden sehen:

5.0
Cannot divide by zero!
2.0

Wie Sie sehen können, stürzt das Programm nicht mehr ab, wenn Sie durch Null teilen. Stattdessen fängt der except-Block den ZeroDivisionError ab, und die Nachricht "Cannot divide by zero!" wird ausgegeben. Das Programm setzt dann die Ausführung fort, und die letzte print-Anweisung wird ebenfalls erfolgreich ausgeführt.

try-except-Blöcke können auch verwendet werden, um andere Arten von Ausnahmen zu behandeln. Beispielsweise können Sie einen try-except-Block verwenden, um TypeError-Ausnahmen zu behandeln, die auftreten können, wenn Sie einen Vorgang mit inkompatiblen Datentypen ausführen. Sie können auch mehrere except-Blöcke haben, um verschiedene Arten von Ausnahmen zu behandeln.

Im nächsten Schritt lernen Sie, wie Sie pytest verwenden können, um auf Ausnahmen zu testen.

Testen mit pytest.raises (Optionale Einführung)

In diesem optionalen Schritt erhalten Sie eine kurze Einführung in die Verwendung von pytest zum Testen auf Ausnahmen (Exceptions). pytest ist ein beliebtes Testframework für Python, das den Prozess des Schreibens und Ausführens von Tests vereinfacht.

Zunächst installieren wir pytest. Öffnen Sie das Terminal in VS Code und führen Sie den folgenden Befehl aus:

pip install pytest

Dieser Befehl lädt pytest und seine Abhängigkeiten herunter und installiert sie.

Nun erstellen wir eine Testdatei für unsere divide-Funktion. Erstellen Sie eine neue Datei namens test_exceptions.py im Verzeichnis ~/project.

## ~/project/test_exceptions.py
import pytest
from exceptions_example import divide

def test_divide_by_zero():
    with pytest.raises(ZeroDivisionError):
        divide(5, 0)

def test_divide_valid():
    assert divide(10, 2) == 5

In diesem Code:

  • Wir importieren das pytest-Modul und die divide-Funktion aus unserer exceptions_example.py-Datei.
  • Wir definieren eine Testfunktion namens test_divide_by_zero. Diese Funktion verwendet pytest.raises, um zu überprüfen, dass der Aufruf von divide(5, 0) einen ZeroDivisionError auslöst. Der Block with pytest.raises(ZeroDivisionError): stellt sicher, dass der Test nur bestanden wird, wenn innerhalb des Blocks ein ZeroDivisionError ausgelöst wird.
  • Wir definieren eine weitere Testfunktion namens test_divide_valid. Diese Funktion überprüft, dass der Aufruf von divide(10, 2) den Wert 5 zurückgibt.

Um die Tests auszuführen, öffnen Sie das Terminal in VS Code und führen Sie den folgenden Befehl aus:

pytest ~/project/test_exceptions.py

Sie sollten eine Ausgabe ähnlich der folgenden sehen:

============================= test session starts ==============================
platform linux -- Python 3.10.12, pytest-7.4.4, pluggy-1.3.0
rootdir: /home/labex/project
collected 2 items

test_exceptions.py ..                                                      [100%]

============================== 2 passed in 0.01s ===============================

Die Ausgabe zeigt, dass zwei Tests erfasst wurden und dass beide Tests bestanden wurden. Dies zeigt, dass unsere divide-Funktion wie erwartet funktioniert: Sie löst einen ZeroDivisionError aus, wenn durch Null geteilt wird, und gibt das richtige Ergebnis zurück, wenn durch eine von Null verschiedene Zahl geteilt wird.

Dies ist ein sehr einfaches Beispiel für die Verwendung von pytest zum Testen auf Ausnahmen. pytest hat viele andere Funktionen, die Ihnen helfen können, umfassendere und effektivere Tests zu schreiben.

Zusammenfassung

In diesem Lab beginnen Sie mit der Untersuchung von Ausnahmen (Exceptions) in Python-Funktionen. Sie lernen, dass Ausnahmen Ereignisse sind, die den normalen Ablauf eines Programms unterbrechen. Sie erstellen eine divide-Funktion, die einen ZeroDivisionError auslöst, wenn durch Null geteilt wird. Beim Ausführen des Skripts wird gezeigt, wie die Ausnahme das Programm beendet und wie ein Traceback für die Fehlersuche bereitgestellt wird.

Das Lab hebt die Wichtigkeit des Verständnisses von Ausnahmen für das Schreiben robuster Code hervor. Es zeigt ein einfaches Beispiel einer Funktion, die eine Ausnahme auslösen kann, und wie man den resultierenden Fehler und den Traceback beobachten kann, wenn die Ausnahme auftritt.