Исключения сложны.
Вы должны ловить только те, которые ожидаете, и те, кого вы ожидаете, должны быть пойманы на уровне абстракции, который знает о задаче, которую он пытается выполнить, а не на более низкой, которая просто знает о небольшой части задачи.
Например, у вас есть функция, которая сохраняет временные файлы. Эта функция вызывает функции, которые, например, генерируют временное имя файла, сохраняют файл и затем возвращают путь временного файла.
Если функция сохранения файла обнаружит, что вы дали ей имя файла, которое уже существует в каталоге, то эта функция не должна с ним работать. Он не знает о именовании временных файлов. Функция, которую вы вызываете для сохранения временного файла, вероятно, должна его обрабатывать - она знает, как называть файлы, и знала, что вы можете создать дубликат. Таким образом, вы можете сгенерировать новое имя и повторить попытку.
функция new_temp_file:
пытаться:
name = generate_temp_name ()
save_temp_file (имя)
вернуть имя
поймать ExistingNameError:
return new_temp_file ()
Если вы поймаете его выше, чем это, то более высокие уровни абстракции слишком много знают о более низких уровнях.
Это всего лишь простой пример, но я надеюсь, что вы получите то, о чем я так неоднозначно говорю: поймать исключение, где должно быть обнаружено исключение.