如何构造请求异常处理并检查200个响应?

时间:2019-03-31 16:20:29

标签: python python-requests

  1. 如何构造代码,以免出现此错误:
    UnboundLocalError: local variable 'r' referenced before assignment

  2. 如果我想确保在返回r.json()之前得到200的响应,应该将这段代码放在try块的内部还是外部?

    if r.status_code == requests.code['ok']
    

我的功能:

def get_req():
    url = 'https://www.example.com/search'
    data = {'p': 'something'}
    try:
        r = requests.get(url, params=data)
        r.raise_for_status()
    except requests.exceptions.HTTPError as err:
        print(err)
    return r.json()

2 个答案:

答案 0 :(得分:0)

您的函数应如下所示:

def get_req():
    url = 'https://www.example.com/search'
    data = {'p': 'something'}
    try:
        r = requests.get(url, params=data)
        r.raise_for_status()
        if r.status_code == requests.code['ok']:
            return r.json()
    except requests.exceptions.HTTPError as err:
        print(err)
        sys.exit(1)

希望这会有所帮助

答案 1 :(得分:0)

我看不到任何方式可以得到该错误。我看不到对 r 的引用,除非您成功调用了 requests.get()并正确设置了 r 。您确定在显示给我们的代码中会看到这种情况吗?

为什么要检查状态码200?您已经在调用 raise_for_status(),基本上可以做到这一点。 raise_for_status()检查是否有其他表示成功的代码,但是您可能还希望您的代码也将这些代码视为成功。因此,我认为您无需明确检查200。

因此,当您调用 r.json()并返回时,这应该就是您想要做的。

更新:现在,您已经删除了 sys.exit(),在错误情况下,您必须做一些特定的事情。在评论中,我给了您我看到的四种可能性。最简单的方法是,如果请求失败,则将您的方法声明为返回 None 。这会将最少的信息返回给调用者,但是您已经在打印错误,所以可能没问题。在这种情况下,您的代码将如下所示:

def get_req():
    url = 'https://www.example.com/search'
    data = {'p': 'something'}
    try:
        r = requests.get(url, params=data)
        r.raise_for_status()
    except requests.exceptions.HTTPError as err:
        print(err)
        return None
    return r.json()

如果您定义在请求失败时返回 None ,但在某些其他情况下引发异常(这是预期的行为),则此代码是“正确的”。如果您不希望此方法引发异常,则可能要捕获 Exception 或单独捕获。我不知道 requests.get()是否可能引发 HTTPError 以外的其他异常。也许不是,在这种情况下,此代码永远不会按原样抛出异常。 IMO,最好假设它可以,并明确处理该案件。这样的代码更具可读性,不需要将来的读者知道 requests.get()能够抛出什么异常来理解所有情况下此代码的行为。