Перехватывай предсказуемые сбои через try/except/else/finally и возбуждай собственные исключения, чтобы сигнализировать о некорректных данных.
Открыть этот урок в KodokonНастоящая программа падает: файла нет, ввод некорректен, сеть оборвалась. Python сигнализирует о таких ситуациях исключениями: они прерывают выполнение и поднимаются вверх по стеку вызовов, пока их не перехватит try/except. Профессиональный рефлекс: перехватывать максимально конкретное исключение и как можно ближе к тому месту, где ты знаешь, что с ним делать.
def parse_age(text):
try:
return int(text)
except ValueError:
return None
print(parse_age("34")) # 34
print(parse_age("thirty")) # NoneПолный блок состоит из четырёх ветвей. try содержит рискованный код, except обрабатывает сбой, else выполняется только если исключения не было, а finally выполняется в любом случае - идеально, чтобы освободить ресурс или записать лог. Смысл else: держать try минимальным, чтобы с первого взгляда было видно, какая строка может упасть.
values = ["10", "abc", "25"]
total = 0
for value in values:
try:
number = int(value)
except ValueError:
print(f"Skip : {value}")
else:
total += number
finally:
print(f"Process : {value}")
print(total) # 35Твои функции тоже могут возбуждать собственные исключения через raise, как только полученные данные оказываются некорректными: лучше упасть сразу с понятным сообщением, чем выдать неверный результат. Определи отдельный класс, наследующий от Exception: вызывающий код сможет перехватить именно его, не задевая случайно другие ошибки.
class EmptyCartError(Exception):
pass
def checkout(items):
if not items:
raise EmptyCartError("Empty cart.")
return round(sum(items), 2)
try:
print(checkout([]))
except EmptyCartError as error:
print(f"Error : {error}")