Я обнаружил, что обрабатываю исключения, не указав тип исключения, когда я вызываю код, который взаимодействует с системными библиотеками, такими как shutil, http и т. Д., Все из которых могут выходить, если система находится в неожиданном состоянии (например, файл заблокирован, сеть недоступна, и т.д.)Только ошибки времени выполнения Python
try:
# call something
except:
print("OK, so it went wrong.")
Это беспокоит меня, потому что он также ловит SyntaxError
и другие исключения, основанные на ошибки программиста, и я видел, рекомендации, чтобы избежать таких открытые обработчики исключений.
Существует ли соглашение о том, что все ошибки времени выполнения происходят из некоторого общего базового класса исключений, который я могу использовать здесь? Или что-нибудь, что не связано с синтаксическими ошибками, ошибками импорта модулей и т. Д.? Даже KeyError
Я бы рассмотрел ошибку, потому что я предпочитаю использовать dict.get(), если я не уверен на 100%, что ключ будет там.
Мне не хотелось бы перечислять все возможные типы исключений, тем более, что я вызываю много поддерживающего кода, в котором я не контролирую.
UPDATE: OK, ответы заставили меня понять, я прошу неправильный вопрос - то, что я на самом деле интересно, если есть соглашение Python или явная рекомендация для библиотеки писателей использовать специальные базовые классы для их исключения , чтобы отделить их от более мирских SyntaxError
& друзей.
Потому что, если есть соглашение для библиотек, я, как потребитель библиотеки, может делать общие предположения о том, что может быть выбрано, даже если конкретные случаи могут отличаться. Не уверен, что это имеет смысл?
UPDATE СНОВА: ответ Свен, наконец, привел меня, чтобы понять, что вместо того, чтобы сдаться и ловить все на высшем уровне, я могу справиться и уточнить исключения на более низких уровнях, поэтому верхний уровень нужно беспокоиться только о конкретный тип исключения с уровня ниже.
Спасибо!
Спасибо, я обыскал, но не смог вырвать ясный ответ. Где различие между ошибками синтаксиса/программиста и ошибками времени выполнения? –
Обратите внимание, что вы обычно не можете поймать 'SyntaxError' - он будет выброшен, если * компилирует * источник, задолго до его выполнения. Единственные случаи, когда 'SyntaxError' можно поймать, если ваш блок' try' содержит 'import',' exec', 'execfile()' или 'eval()'. –
@SvenMarnach: Да, я был уверен, что видел, как эти обработчики типа не улавливают даже синтаксические ошибки, но это могло быть что-то еще, более тонкое. У меня нет чистого примера. Спасибо за исправление. –