Хотя ответ Джеймса почти всегда то, что вы на самом деле хотите, это не совсем то, о чем просил ОП:
Есть ли способ исключить любое произвольное исключение и иметь возможность распечатать сообщение об исключении в блоке исключения?
Exception
фактически не обрабатывает все исключения, только все исключения, которые вы обычно хотите перехватить. В частности, в 2.5 и позже:
Все встроенные, не выходящие из системы исключения, являются производными от этого класса. Все определяемые пользователем исключения также должны быть производными от этого класса.
Это оставляет несколько вещей:
- встроенные системные выходящие исключения, такие как
KeyboardInterrupt
от пользователя, нажимающего ^C
(только 2.5 и более поздние версии)
- определяемые пользователем исключения, которые не следуют этому «следует»
Очень редко вы хотите обрабатывать такие вещи, как KeyboardInterrupt
, и в этом случае вы используете BaseException
вместо Exception
. (См. Иерархия исключений для списка исключений, которые являются Exception
подклассами.) Итак:
try:
# stuff
except BaseException as e:
print e
И (обычно временно во время отладки) иногда вы действительно хотите обрабатывать абсолютно все. В 2.7 это включает исключения, определенные как классы старого стиля; в 2.5 и ранее, он также включает в себя строки. Единственный способ использовать все эти возможности - использовать except
, а затем использовать sys.exc_info
(и, необязательно, повторно raise
все, что вы не хотели обрабатывать):
try:
# stuff
except:
type, value, traceback = sys.exc_info()
print value
В качестве примечания я использую синтаксис нового стиля except
(except Exception as e
) выше. Это работает в 2.6 и позже, включая 3.x. Синтаксис старого стиля (except Exception, e
) устарел в 2.6 и перестает работать в 3.0, но если вы хотите работать со старыми версиями 2.x, вам нужно его использовать.