Python получает код ошибки из исключения

В python у меня есть код, который обрабатывает исключения и печатает коды ошибок и сообщения.

try:
    somecode() #raises NameError
except Exception as e:
    print('Error! Code: {c}, Message, {m}'.format(c = e.code, m = str(e))

Однако e.code не является правильным способом получения имени ошибки (NameError), и я не могу найти ответ на этот вопрос. Как я должен получить код ошибки?


person Pythonic Guy 21421    schedule 09.12.2017    source источник
comment
Код ошибки (что бы это ни значило) или название ошибки? Для последнего попробуйте type(e).__name__   -  person Michael Butscher    schedule 09.12.2017
comment
как насчет e.message   -  person user1767754    schedule 09.12.2017
comment
Вы смотрели документацию Python для класса Exception?   -  person OneCricketeer    schedule 09.12.2017
comment
используйте print( dir(e) ), чтобы увидеть, какие поля у вас есть в e. Каждое исключение может иметь разные поля.   -  person furas    schedule 09.12.2017


Ответы (4)


Попробуй это:

try:
    somecode() #raises NameError
except Exception as e:
    print('Error! Code: {c}, Message, {m}'.format(c = type(e).__name__, m = str(e)))

Прочитайте это для более подробного объяснения.

person 63677    schedule 09.12.2017
comment
Это не печатает код ошибки, а только имя исключения NameError и сообщение об исключении. - person Hamman Samuel; 07.10.2018
comment
Моды: это не следует помечать как правильный ответ, так как это не отвечает на вопрос. - person rjurney; 21.01.2020
comment
Смотрите мой ответ (то, что я считаю) правильным. - person François M.; 13.11.2020

Исключения Python не имеют «кодов».

Вы можете создать пользовательское исключение, которое имеет свойство с именем code, а затем вы можете получить к нему доступ и распечатать его по желанию.

В этом ответе есть пример добавления свойства code к пользовательскому исключению.

person Dustin Wyatt    schedule 22.01.2020

Ваш вопрос не ясен, но насколько я понимаю, вы хотите найти не название ошибки (NameError), а код ошибки. Вот как это сделать. Сначала запустите это:

try:
    # here, run some version of your code that you know will fail, for instance:
    this_variable_does_not_exist_so_this_code_will_fail
except Exception as e:
    print(dir(e))

Теперь вы можете видеть, что находится в e. Вы получите что-то вроде этого:

['__cause__', '__class__', '__context__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setstate__', '__sizeof__', '__str__', '__subclasshook__', '__suppress_context__', '__traceback__', 'args', 'with_traceback']

Этот список будет включать специальные методы (__x__ штучки), но будет заканчиваться элементами без подчеркивания. Вы можете попробовать их один за другим, чтобы найти то, что вы хотите, например:

try:
    # here, run some version of your code that you know will fail, for instance:
    this_variable_does_not_exist_so_this_code_will_fail
except Exception as e:
    print(e.args)
    print(e.with_traceback)

В случае этой конкретной ошибки print(e.args) ближе всего к коду ошибки, он выведет ("name 'this_variable_does_not_exist_so_this_code_will_fail' is not defined",).

В этом случае можно попробовать только две вещи, но в вашем случае ваша ошибка может иметь больше. Например, в моем случае с ошибкой Tweepy список был таким:

['__cause__', '__class__', '__context__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setstate__', '__sizeof__', '__str__', '__subclasshook__', '__suppress_context__', '__traceback__', '__weakref__', 'api_code', 'args', 'reason', 'response', 'with_traceback']

Я попробовал последние пять один за другим. Из print(e.args) я получил ([{'code': 187, 'message': 'Status is a duplicate.'}],), а из print(e.api_code) я получил 187. Итак, я понял, что либо e.args[0][0]["code"], либо e.api_code дадут мне код ошибки, который я ищу.

person François M.    schedule 13.11.2020

Поскольку он возвращает объект кортежа кортежа словаря, мы можем извлечь код как

try:
  
  pass

except Exception as e:

  print(e[0][0]['code'] + e[0][0]['message'])
person M.G    schedule 11.09.2020