如何构造代码,以免出现此错误:
UnboundLocalError: local variable 'r' referenced before assignment
。
如果我想确保在返回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()
答案 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()能够抛出什么异常来理解所有情况下此代码的行为。