Попробовать или проверить заранее
Когда пишут try, а когда обычное условие — и почему проверка заранее иногда просто неверна.
Два подхода
# проверить заранее
if "цена" in tovar:
cena = tovar["цена"]
# попробовать и поймать
try:
cena = tovar["цена"]
except KeyError:
cena = 0
Оба верны. В Python чаще предпочитают второй, и у этого есть причины помимо вкуса.
Причина первая: проверка бывает неполной
if stroka.isdigit():
chislo = int(stroka)
Выглядит надёжно, но isdigit скажет «нет» на -5 и на 7,
хотя int их прекрасно разберёт. Проверка отсекает то, что работает.
Попытка и перехват точнее: разбирает ровно то, что разбирается.
Причина вторая: между проверкой и делом что-то меняется
import os
if os.path.exists(imya): # файл есть
with open(imya) as f: # а здесь его уже удалили
Дырка маленькая, но настоящая, и у неё есть имя — состояние гонки.
Попытка открыть и перехват FileNotFoundError её не имеет.
Когда проверка лучше
Когда ситуация не исключительная, а обычная ветка логики:
if zapisalos == 0:
return 0.0
return prishlo / zapisalos * 100
Ноль записавшихся в понедельник — не чрезвычайное происшествие. Читается такой код проще, и исключение здесь было бы громким словом про обычное дело.
Ещё проверка удобнее для одного обращения: slovar.get(klyuch,
zapasnoe) короче четырёх строк try.
Правило
Одно действие с понятным запасным значением — проверка или get.
Несколько действий подряд, любое из которых может упасть, — один
try на всё. Разбор данных от людей — почти всегда try: там
ошибок больше, чем правил.