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