EMZETT.
Войти

ZeroDivisionError и ValueError (Python)

Коротко: Деление на ноль вызывает ZeroDivisionError; ValueError возникает, когда значение имеет правильный тип, но неподходящее содержимое.

Подробнее: Обе ошибки означают входные данные, которые код не может обработать. Они часты особенно при вводе пользователя, работе с файлами и вычислениями.

Подробности

ZeroDivisionError

print(10 / 0)   # ZeroDivisionError: division by zero

10 % 0 и 10 // 0 тоже вызывают её. Решение: проверяйте перед делением (if denominator != 0:) и обрабатывайте случай (значение по умолчанию, сообщение об ошибке). С числами с плавающей точкой результат может быть «почти ноль»; тогда работайте с допуском (math.isclose).

ValueError

int("abc")        # ValueError: invalid literal for int() with base 10: 'abc'
float("1,5")      # ValueError (запятая вместо точки)
import math
math.sqrt(-1)     # ValueError: math domain error
a, b = [1, 2, 3]  # ValueError: too many values to unpack

Решения: проверяйте или очищайте ввод (text.strip(), замена запятой на точку), страхуйтесь через str.isdigit() или try/except ValueError и давайте пользователю понятное сообщение. При распаковке проверяйте длину списка.

Перехват ошибок

try:
    number = int(input("Number: "))
    print(100 / number)
except ValueError:
    print("Please enter a whole number.")
except ZeroDivisionError:
    print("You cannot divide by zero.")

Перехватывайте только конкретные ошибки, а не общий except:; иначе вы скроете настоящие ошибки программирования. Проверяйте ввод рано и давайте чёткую обратную связь.

См. также: TypeError, KeyError и IndexError, Код выхода 1