HOWTO · Python

ZeroDivisionError: Float-Division durch Null in Python

Wir werden demonstrieren, wie der Nulldivisionsfehler in Python behoben wird.

Auf dieser Seite

Python löst ZeroDivisionError aus, wenn der Divisor einer Division null ist. Das kann bei Ganzzahlen und Gleitkommazahlen passieren, auch wenn erst eine Berechnung den Divisor ergibt. Dieser Leitfaden erklärt die Ursache, zeigt das Verhalten bei Ganzzahl- und Gleitkommadivision und stellt zwei Möglichkeiten vor, mit dem Ergebnis umzugehen. Die Beispiele zeigen die beobachteten Ergebnisse für gewöhnliche Divisionen, Divisoren gleich null und beide Behandlungsweisen. Die Ausgaben in den unveränderten Codeblöcken bleiben auf Englisch.

Was verursacht ZeroDivisionError?

Führen Sie dieses Beispiel aus. Der Beispielcode und die angezeigte Ausgabe bleiben auf Englisch:

print(14 / 2)
7.0

Bei einer fehlerhaften Division meldet Python ZeroDivisionError: division by zero. Die Ausnahme wird vom Divisionsoperator ausgelöst und betrifft nicht nur Gleitkommadivisionen. Sowohl ein ganzzahliger Divisor 0 als auch ein Gleitkommadivisor 0.0 lösen sie aus. Im folgenden eigenständigen Beispiel ergibt die Subtraktion gleicher Werte den Divisor null. Der Exception-Handler gibt Typ und Meldung der Ausnahme aus, sodass sie nach dem Ausführen des Codes als Text ausgewählt werden können. Die beobachtete Ausgabe zeigt bei ganzzahliger Division und Gleitkommadivision durch null denselben Ausnahmetyp und dieselbe Meldung. Die Ausgaben im unveränderten Beispielcode bleiben auf Englisch.

for numerator, divisor in [(17, 8 - 8), (17.0, 8.0 - 8.0)]:
    try:
        print(numerator / divisor)
    except ZeroDivisionError as error:
        print(f"{type(error).__name__}: {error}")
ZeroDivisionError: division by zero
ZeroDivisionError: division by zero

Der Ausdruck, aus dem der Divisor hervorgeht, ist ebenso wichtig wie der Anfangswert einer Variablen. Eine Berechnung, eine in eine Zahl umgewandelte Benutzereingabe oder eine spätere Änderung kann null ergeben. Gleitkommazahlen machen eine Division durch null nicht zulässig, und die Ausnahmemeldung bedeutet nicht, dass der Zähler das Problem ist. Prüfen Sie den Wert auf der rechten Seite von / genau an der Stelle, an der die Division stattfindet.

Prüfen Sie den Divisor vor der Division

Wenn null als Wert zu erwarten ist, prüfen Sie zuerst den Divisor und wählen Sie ein für die Anwendung sinnvolles Ergebnis. Das folgende Beispiel verwendet None, um anzuzeigen, dass kein Quotient verfügbar ist. Ein anderes Programm könnte die Berechnung überspringen, eine Meldung anzeigen oder eine zur jeweiligen Domäne passende Ausweichregel anwenden. Ersetzen Sie den Wert nicht durch eine beliebige Zahl, sofern sie in der Berechnung keine gültige Bedeutung hat. Der unveränderte Beispielcode und seine Ausgabe bleiben auf Englisch.

numerator = 17
divisor = 8 - 8

if divisor == 0:
    quotient = None
else:
    quotient = numerator / divisor

print(quotient)
None

Diese Prüfung verhindert die Division, wenn der Divisor null ist. Sie ist hilfreich, wenn null eine normale Eingabe ist und das Programm vor der Berechnung entscheiden muss, was zu tun ist. Vergleichen Sie den Divisor mit null und nicht mit einem positiven Grenzwert: Negative Divisoren sind in der gewöhnlichen Arithmetik gültig. Kann sich der Wert zwischen Prüfung und Division ändern, halten Sie beide Schritte eng zusammen oder fangen Sie die Ausnahme rund um die Division ab.

Division mit try und except behandeln

Verwenden Sie eine try-Klausel, wenn die Division ausgeführt wird, und behandeln Sie ZeroDivisionError mit einer passenden except-Klausel. Wenn Sie gezielt diese Ausnahme abfangen, bleiben andere Programmierfehler sichtbar, statt jede Art von Fehler als Division durch null zu behandeln. Das ausführbare Beispiel zeigt sowohl eine erfolgreiche Division als auch den Fall mit Divisor null; die beobachtete Ausgabe steht darunter. Die im unveränderten Beispielcode ausgegebenen Meldungen bleiben auf Englisch.

for divisor in (4, 0):
    try:
        print(20 / divisor)
    except ZeroDivisionError:
        print("Cannot divide by zero.")
5.0
Cannot divide by zero.

Die Schlüsselwörter try und except bilden die Syntax zur Ausnahmebehandlung in Python; es sind keine Methoden. Platzieren Sie den Code, der die Ausnahme auslösen kann, im try-Block und die Wiederherstellungsaktion im passenden Handler. Ist keine geeignete Wiederherstellung möglich, lassen Sie die Ausnahme weiterlaufen, damit der aufrufende Code sie behandeln kann.

Wählen Sie eine Strategie für Ihren Code

Bevorzugen Sie eine Prüfung vor der Division, wenn null als Eingabe zu erwarten ist und Sie das passende alternative Verhalten bereits kennen. Verwenden Sie try/except ZeroDivisionError, wenn der Versuch, die Operation auszuführen, der klarste Weg ist und sich der Ausnahmefall sinnvoll behandeln lässt. Beide Ansätze sollten die Bedeutung der Berechnung bewahren, statt den Fehler lediglich zu verbergen.

Keiner der Ansätze garantiert, dass die gesamte Anwendung fehlerfrei bleibt: Andere Operationen können andere Ausnahmen auslösen, und auch eine Ausweichlösung kann für die jeweilige Domäne falsch sein. Vermeiden Sie ein nacktes except, das andere Fehler verbergen kann. Wenn Sie einen bestehenden Fehler untersuchen, verfolgen Sie den Divisor bis zu seiner Quelle zurück und prüfen Sie die Arithmetik oder Eingabe, aus der er hervorgegangen ist. Entscheiden Sie anschließend, ob null zurückgewiesen, als nicht verfügbares Ergebnis dargestellt oder nach einer domänenspezifischen Regel behandelt werden soll.