Какие исключения в Python вы ловите чаще всего и как обрабатываете?
Приведите пример блока try/except из своего кода. Какие ошибки вы отлавливаете конкретно (ValueError, TypeError, FileNotFoundError)? Используете ли вы конструкцию else и finally?
2 ответа
Поддержу последний абзац и усилю: голый except: ловит вообще всё, даже Ctrl+C — он перехватывает BaseException, а не только Exception. Не знаете, что прилетит — пишите хотя бы except Exception as e: и логируйте e, а не pass. Молчаливый except: pass — самый дорогой антипаттерн новичка: программа «работает», а почему результат кривой, выяснится через неделю.
Топ по частоте у меня такой: ValueError — всё, что связано с вводом и конвертацией (int('abc')), FileNotFoundError — файла нет там, где обещали, KeyError — в данных не оказалось поля, которое «всегда есть».
Кусок из живого скрипта:
try:
with open(path, encoding='utf-8') as f:
data = json.load(f)
except FileNotFoundError:
print(f'нет файла {path}, пропускаю')
data = None
except json.JSONDecodeError as e:
print(f'битый json: {e}')
data = None
else использую редко, finally — почти никогда: его главную работу, закрыть ресурс, давно делает with.
Единственное железное правило — не писать голый except: без типа. Он глотает всё подряд, включая опечатки в соседнем коде, и превращает отладку в спиритический сеанс.