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), и я не могу найти ответ на этот вопрос. Как мне получить код ошибки?

5 ответов

Решение

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

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

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

Это сработало для меня.

        except Exception as e:
    errnum = e.args[0]

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

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

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

Ваш вопрос непонятен, но насколько я понимаю, вы не хотите находить название ошибки (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 даст мне код ошибки, который я ищу.

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

try:
  
  pass

except Exception as e:

  print(e[0][0]['code'] + e[0][0]['message'])
Другие вопросы по тегам