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'])