Все остальные ответы указывают на то, что вы не должны ловить общие исключения, но никто, кажется, не хочет говорить вам, почему, что важно для понимания, когда вы можете нарушить «правило». Здесь - это объяснение.По сути, вы не скрываете:
Так что, если вы позаботитесь о том, чтобы не делать ничего из этого, можно поймать универсальное исключение.Например, вы можете предоставить пользователю информацию об исключении другим способом, например:
- Представлять исключения в виде диалогов в графическом интерфейсе
- Передавать исключения из рабочего потока или процесса вуправление потоком или процессом в многопоточном или многопроцессорном приложении
Так как отловить универсальное исключение?Есть несколько способов.Если вы просто хотите получить объект исключения, сделайте это следующим образом:
try:
someFunction()
except Exception as ex:
template = "An exception of type {0} occurred. Arguments:\n{1!r}"
message = template.format(type(ex).__name__, ex.args)
print message
Сделайте уверенным, что message
доведен до сведения пользователя в упущенном виде!Его печати, как показано выше, может быть недостаточно, если сообщение скрыто во многих других сообщениях.Неспособность привлечь внимание пользователей равносильно глотанию всех исключений, и если есть одно впечатление, которое вы должны были оставить после прочтения ответов на этой странице, это то, что это не очень хорошая вещь .Завершение блока исключений с помощью оператора raise
устранит проблему, прозрачно переосмыслив исключение, которое было перехвачено.
Разница между приведенным выше и использованием просто except:
без каких-либо аргументов в два раза:
- Голый
except:
не дает вам объект исключения для проверки - Исключения
SystemExit
, KeyboardInterrupt
и GeneratorExit
не перехватываются вышеуказанным кодом, которыйв общем то что ты хочешь.См. Иерархию исключений .
Если вам также нужна та же самая трассировка стека, которую вы получаете, если вы не перехватываете исключение, вы можете получить его вот так (по-прежнему внутри предложения исключений):
import traceback
print traceback.format_exc()
Если вы используете модуль logging
, вы можете распечатать исключение в журнал (вместе с сообщением) следующим образом:
import logging
log = logging.getLogger()
log.exception("Message for you, sir!")
Если вы хотите копать глубже и исследовать стек, посмотреть переменные и т. Д., Используйте функцию post_mortem
модуля pdb
внутри блока исключений:
import pdb
pdb.post_mortem()
Я обнаружил, что этот последний метод неоценим при поиске ошибок.