Все остальные ответы указывают на то, что вы не должны ловить общие исключения, но никто, кажется, не хочет говорить вам, почему, что важно для понимания, когда вы можете нарушить «правило». Вот объяснение. По сути, это так, что вы не скрываете
Поэтому, если вы позаботитесь о том, чтобы не делать ничего из этого, можно поймать общее исключение. Например, вы можете предоставить пользователю информацию об исключении другим способом, например:
- Представлять исключения в виде диалогов в графическом интерфейсе
- Перенос исключений из рабочего потока или процесса в управляющий поток или процесс в многопоточном или многопроцессорном приложении
Так как же поймать общее исключение? Есть несколько способов. Если вы просто хотите объект исключения, сделайте это так:
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
модуля внутри блока exc:
import pdb
pdb.post_mortem()
Я обнаружил, что этот последний метод неоценим при поиске ошибок.
except:
(без голыхraise
), за исключением, может быть, один раз для каждой программы, и желательно не тогда.