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