【问题标题】:python not catching HTTPErrorpython没有捕获HTTPError
【发布时间】:2016-05-06 22:37:28
【问题描述】:

我的代码如下:

import json
import urllib2
from urllib2 import HTTPError

def karma_reddit(user):
    while True:
        try:
            url = "https://www.reddit.com/user/" + str(user) + ".json"
            data = json.load(urllib2.urlopen(url))
        except urllib2.HTTPError as err:
            if err == "Too Many Requests":
                continue
            if err == "Not Found":
                print str(user) + " isn't a valid username."
            else:
                raise
        break

我正在尝试从 reddit 用户个人资料中获取数据。但是 HTTPErrors 不断发生。当试图使用 except 语句捕获它们时,它们会不断出现,而程序不会执行循环的另一次迭代或 print 语句。我如何设法捕获 HTTPErrors?我对 Python 很陌生,所以这可能是一个新手错误。谢谢!

【问题讨论】:

    标签: python python-2.7 exception-handling ipython


    【解决方案1】:

    您需要检查err.msg 的字符串,err 本身永远不会等于任何一个,因此您总是会到达 else:raise :

    if err.msg == "Too Many Requests":
         continue
    if err.msg == "Not Found":
         print str(user) + " isn't a valid username."
    

    我会推荐使用requests 并且使用reddit 错误代码实际上是在json 中返回的,所以你可以使用它:

    import requests
    
    
    def karma_reddit(user):
        while True:
            data = requests.get("https://www.reddit.com/user/" + str(user) + ".json").json()
            if data.get("error") == 429:
                print("Too many requests")
            elif data.get("error") == 404:
                print str(user) + " isn't a valid username."
            return data
    

    事实上,您提出了所有例外,除了 429 和 404,这意味着您不需要尝试。你真的应该打破任何错误,只向用户输出一条消息并限制请求的数量。

    【讨论】:

    • 我建议检查异常中的 err.code
    猜你喜欢
    • 2020-12-16
    • 1970-01-01
    • 2011-08-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多