Как распечатать исключение в Python 3?

Прямо сейчас я улавливаю исключение в предложении except Exception: и делаю print(exception). Результат не дает никакой информации, поскольку он всегда печатает <class 'Exception'>. Я знал, что это работает на python 2, но как это сделать в python3?

Ответ 1

Я предполагаю, что вам нужно назначить Exception переменной. Как показано в учебнике Python 3:

def fails():
    x = 1 / 0

try:
    fails()
except Exception as ex:
    print(ex)

Чтобы дать краткое объяснение, as - это ключевое слово псевдоопределения, используемое в некоторых составных операторах для назначения или псевдонимы предыдущего оператора переменной.

В этом случае as присваивает исключенное исключение переменной, позволяющей информацию об исключении хранить и использовать позже, вместо того, чтобы немедленно обращаться с ней. (Это подробно обсуждается в Справочник по языку Python 3: инструкция try.)


Другим составным выражением с помощью as является оператор with:

@contextmanager
def opening(filename):
    f = open(filename)
    try:
        yield f
    finally:
        f.close()

with opening(filename) as f:
    # ...read data from f...

Здесь операторы with используются для обертывания выполнения блока методами, описанными контекстными менеджерами. Это работает как расширенный оператор try...except...finally в аккуратном пакете генераторов, а оператор as присваивает полученному генератором результат от диспетчера контекста переменной для расширенного использования. (Это подробно обсуждается в Справочник по языку Python 3: инструкция with.)


Наконец, as можно использовать при импорте модулей, чтобы псевдоним модуля отличался (обычно короче):

import foo.bar.baz as fbb

Это подробно обсуждается в Справочник по языку Python 3: инструкция import.

Ответ 2

Это изменения со времен Python 2:

    try:
        1 / 0
    except Exception as e: # (as opposed to except Exception, e:)
                           # ^ that will just look for two classes, Exception and e
        # for the repr
        print(repr(e))
        # for just the message, or str(e), since print calls str under the hood
        print(e)
        # the arguments that the exception has been called with. 
        # the first one is usually the message. (OSError is different, though)
        print(e.args)

Вы можете заглянуть в стандартный библиотечный модуль traceback для более интересных вещей.

Ответ 3

Попробуйте

except Exception as e:
    print(e)