python - 如何构建请求异常处理并检查 200 响应?
问题描述
我应该如何构造代码,这样我就不会收到这个错误:
UnboundLocalError: local variable 'r' referenced before assignment
.如果我想确保在返回之前得到 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()
解决方案
我看不出有任何方法可以得到该错误。除非您对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()能够抛出哪些异常来理解这段代码在所有情况下的行为。
推荐阅读
- c# - 为什么 async 方法比 .NET Core 3.1 中的同步版本更快?
- python - 根据包含 NaN 值的其他两个列在 pandas DataFrame 中创建一个新列
- python - 按列值连接数据框(无外部合并)
- angular-ui-router - angular 9 candeactivate 不起作用,尽管代码似乎很好并且没有抛出任何错误
- postgresql - PostgreSQL 12.3 Windows x86-64 安装程序无法启动
- unity3d - Sprites 未分配给材质
- r - 制作特殊矩阵的最佳方法
- java - Windows 上的 Docker 引擎忽略 Spring Boot Web 应用程序的 server.port 属性
- haskell - Haskell 中伴随函子的函数依赖
- java - spring-cloud bus kafka RemoteApplicationEvent originService 刷新时为空