ZeroDivisionError и ValueError (Python)
Коротко: Деление на ноль вызывает ZeroDivisionError; ValueError возникает, когда значение имеет правильный тип, но неподходящее содержимое.
Подробнее: Обе ошибки означают входные данные, которые код не может обработать. Они часты особенно при вводе пользователя, работе с файлами и вычислениями.
Подробности
ZeroDivisionError
print(10 / 0) # ZeroDivisionError: division by zero10 % 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