Python从异常中获取错误代码

17

在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)的正确方法,我找不到答案。我该如何获取错误代码?


2
错误代码(不知道是什么意思)还是错误名称?对于后者,尝试type(e).__name__ - Michael Butscher
1
e.message 是什么意思? - user1767754
1
你是否查看了Python文档中关于Exception类的内容? - OneCricketeer
1
使用 print( dir(e) ) 查看 e 中有哪些字段。每个异常可能具有不同的字段。 - furas
5个回答

8

这对我很有效。

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

这不会返回代码,因为#Dustin Wyatt的解释。它只返回错误消息。 - JRichardsz

4

Python的异常没有“代码”。

您可以创建一个自定义异常,其中包含一个名为code的属性,然后可以按需访问并打印它。

这个答案提供了一个示例,演示如何添加一个code属性到自定义异常中。


2

您的问题不太清楚,但从我理解的来看,您并不想找到错误的名称(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会给我所寻找的错误代码。


-2

试试这个:

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

阅读this以获取更详细的解释。


5
这不会打印错误代码,只会打印异常“NameError”的名称和异常消息。 - Hamman Samuel
3
Mods: 这不应被标记为正确答案,因为它没有回答问题。 - rjurney
请看我的答案(我认为是正确的)。 - François M.

-2

由于它返回字典的元组的元组对象,因此我们可以提取代码如下:

try:
  
  pass

except Exception as e:

  print(e[0][0]['code'] + e[0][0]['message'])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接