从 tweepy 异常实例中获取错误代码

19

我是Python的新手,正在尝试使用一个库。它引发了一个异常,我正在尝试确定是哪一个异常。这是我的尝试:

except tweepy.TweepError as e:
    print e
    print type(e)
    print e.__dict__
    print e.reason
    print type(e.reason)

这是我得到的内容:

[{u'message': u'Sorry, that page does not exist', u'code': 34}]
<class 'tweepy.error.TweepError'>
{'reason': u"[{u'message': u'Sorry, that page does not exist', u'code': 34}]", 'response': <httplib.HTTPResponse instance at 0x00000000029CEAC8>}
[{u'message': u'Sorry, that page does not exist', u'code': 34}]
<type 'unicode'>

我正在尝试获取那段代码。我已经尝试了 e.reason.code,但没有成功,也不知道该尝试什么。


是的 - 我可能误读了那个 - e.reason[0]['code'] 怎么样? - Jon Clements
追踪(Traceback)(最近的调用在最上面): 文件“descargar.py”,第70行,在<module>中: print e.reason[0]['code'] 类型错误(TypeError):字符串索引必须是整数。 - José D.
@alecxe 抱歉,这是一段时间之前的事情了,我不记得我当时做了什么,但我确实得到了代码(正如我所想要的)。无论如何,你的答案有效,所以我接受了它 :) - José D.
6个回答

24

每个派生自基类Exception的良好异常 都有 一个args属性(类型为tuple),其中包含传递给该异常的参数。大多数情况下,只传递一个参数到异常中,并且可以使用args [0]访问。

Tweepy传递给其异常的参数具有List [dict]类型的结构。您可以使用以下代码从参数中获取错误代码(类型为int)和错误消息(类型为str):

e.args[0][0]['code']
e.args[0][0]['message']
TweepError异常类 还提供了几个额外的有用属性 api_codereasonresponse。尽管它们是公共 API 的一部分,但由于某种原因它们没有被记录文档

因此,您也可以使用以下代码获取错误代码(类型为 int):

e.api_code


历史:

以前可以使用e.message[0]['code']来访问错误代码,但这种方法已不再适用。在Python 2.6中,message属性已经被弃用,在Python 3.0中已经被删除。目前,你会收到一个错误:'TweepError' object has no attribute 'message'


1
谢谢你的帮助。我都快疯了,哈哈。这份文档实在是太过时了。 - Sergio La Rosa
2
e.api_code 返回 None。至少当 status code = 401 时,可能是一个 bug。 - j4n7
@j4n7 请查看Twitter API文档。如果我理解正确,每个响应都包含一个HTTP状态码,但并非每个响应都包含错误代码(API代码)。仅针对最常见的错误提供API代码。 - Jeyekomon
1
很奇怪,速率限制不在 e.api_code 中。请使用 tweepy.RateLimit 异常或 e.args[0][0]['code'] - salvob
这怎么没有被标记为最佳答案!!谢谢。 - viral gandhi

21

这个怎么样?

except tweepy.TweepError as e:
    print e.message[0]['code']  # prints 34
    print e.args[0][0]['code']  # prints 34

1
在我看来,由于e是一个列表对象,所以e.message[0]['code']不起作用。你难道不应该使用e[0]['code']吗? - Austin A
其实,现在我看了一下Github页面,tweepError正在使用__str__覆盖打印语句,这可能就是我一直遇到问题的原因。你知道e是怎样的结构吗? - Austin A
e.message不再起作用了。请查看@Jeyekomon的答案。 - hamza saber

9

自2013年以来,情况发生了很大变化。现在的正确答案是使用e.api_code


2

要仅获取错误代码,请使用monq发布的方法。以下示例说明了如何同时获取错误代码和消息。我必须从e.reason字符串中提取消息,如果有更好的检索消息的方法,请分享。

注意:此代码适用于具有以下格式的任何错误代码/原因。

[{'code': 50, 'message':'找不到用户。'}]

def getExceptionMessage(msg):
    words = msg.split(' ')

    errorMsg = ""
    for index, word in enumerate(words):
        if index not in [0,1,2]:
            errorMsg = errorMsg + ' ' + word
    errorMsg = errorMsg.rstrip("\'}]")
    errorMsg = errorMsg.lstrip(" \'")

    return errorMsg

你可以这样调用它:

try:
    # Some tweepy api call, ex) api.get_user(screen_name = usrScreenName)
except tweepy.TweepError as e:
    print (e.api_code)
    print (getExceptionMessage(e.reason))

1
截至2021年12月(tweepy v4.4.0),正确的方式是:
except tweepy.TweepyException as e:
    print(e)

来源:https://docs.tweepy.org/en/v4.4.0/changelog.html?highlight=TweepError#new-features-improvements

这是有关Tweepy v4.4.0的新功能和改进的更新记录。此版本中的主要更改包括:
- 添加了对Twitter API v2的支持。 - Tweepy现在使用OAuth1.0a进行身份验证,以强制执行所有API请求的加密传输。 - 引入了新的异常“TweepError”,它是所有其他Tweepy特定异常的基类。

0

这是我所做的:

except tweepy.TweepError as e:
    print e.response.status

它真的会打印 tweepy 错误代码(在这种情况下是 34)吗? - alecxe
是的,在出现错误时,它会打印服务器返回的任何HTTP状态代码。 - tmatti
但是,这里的34不是响应状态码,而是Twitter错误代码。 - alecxe
1
我明白你的意思。在这种情况下,我的解决方案是不正确的。对于造成的困惑,我感到抱歉。 - tmatti

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