首页 > 解决方案 > 如何构建请求异常处理并检查 200 响应?

问题描述

  1. 我应该如何构造代码,这样我就不会收到这个错误:
    UnboundLocalError: local variable 'r' referenced before assignment.

  2. 如果我想确保在返回之前得到 200 响应r.json(),我应该把这段代码放在哪里——在块内还是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()

标签: pythonpython-requests

解决方案


我看不出有任何方法可以得到该错误。除非您对requests.get()的调用成功并正确设置r ,否则我看不到对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()能够抛出哪些异常来理解这段代码在所有情况下的行为。


推荐阅读