Что держать внутри try
Лишняя строка под защитой однажды превратит чужую ошибку в вашу.
Правило
Внутри try держат ровно то, что может упасть ожидаемым образом.
Всё остальное — после, в ветке else.
try:
god = int(anketa["год"])
except ValueError:
oshibki.append("год не число")
else:
if god < 1900:
oshibki.append("год вне диапазона")
Почему не внутрь
Проверка диапазона внутри try работала бы точно так же — сравнение
целых исключений не бросает. Разницы в поведении сегодня нет.
Разница появится завтра. Допишете в ту же ветку обращение к словарю
или разбор ещё одного поля — и KeyError молча превратится в «год не
число». Ошибка появится не в тот день, когда её сделали, и искать её
будут долго.
Ветка else
Выполняется, если исключения не было. Нужна ровно для этого: сказать читателю и себе, что вот это защищено, а вот это просто выполняется дальше.
Ветка finally
Выполняется всегда — и при удаче, и при ошибке. Нужна для уборки: закрыть, освободить, вернуть на место.
knopka.disabled = True
try:
otvetit()
finally:
knopka.disabled = False # вернётся в любом случае
Чего не делать
try:
...сорок строк...
except Exception:
pass
Такой except ловит всё, включая опечатки в именах переменных и
требование остановиться по Ctrl+C. Программа перестаёт падать и
начинает молча работать неправильно — это хуже падения, потому что
незаметно.
Ловите конкретные типы. Если непонятно, какие, — посмотрите, чем падает, и перечислите их.