python没有捕获HTTPError

时间:2016-05-06 22:37:28

标签: python python-2.7 exception-handling ipython

我的代码如下:

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用户配置文件中获取数据。但是HTTP错误仍然存​​在。当尝试使用except语句捕获它们时,它们不断出现而程序不执行循环的另一次迭代或print语句。如何设法捕获HTTP错误?我对Python很陌生,所以这可能是一个新手的错误。谢谢!

1 个答案:

答案 0 :(得分:1)

你需要检查err.msg字符串,错误本身永远不会等于你,所以你总是到达其他地方: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意味着你不需要尝试。你应该真正打破任何错误,只是向用户输出一条消息并限制请求数量。