提问人:Abhiram Devisetti 提问时间:11/16/2023 更新时间:11/16/2023 访问量:48
如何从异常对象获取status_code
How to get status_code from an exception object
问:
在我的代码中,我有一个 get 请求,如下所示:
response = requests.get(url)
对于无效的状态代码,即非 2xx,会引发异常,
exp_obj = RequestException(response)
现在我想从这个异常对象中获取状态代码exp_obj
我试过了,但我得到了exp_obj.response.status_code
AttributeError: 'NoneType' object has no attribute 'status_code'
如果我打印exp_obj它与响应对象相同,即<Response [500]>
答:
0赞
Codist
11/16/2023
#1
exp_obj.response 为 None,因为您从未收到来自 URL 的响应。例如,如果找不到 URL 中的主机名,就会发生这种情况。另一方面,例如,如果主机名有效,但子域无效(导致 HTTP 404),那么您将得到一个可以查询的响应
评论
0赞
Abhiram Devisetti
11/16/2023
如果我打印response.status_code我得到一个状态代码,我想如何从异常对象中获取它
0赞
Codist
11/16/2023
@AbhiramDevisetti 如果您收到主机的回复,那么E.response.status_code将是正确的
0赞
Abhiram Devisetti
11/16/2023
是的,但似乎我必须使用命名参数创建一个异常。谢谢!
0赞
0x00
11/16/2023
#2
这感觉像是一个 XY 问题。但是看看你想做什么。您需要检查工作方式。requests.exceptions.RequestException()
class RequestException(IOError):
def __init__(self, *args, **kwargs):
"""Initialize RequestException with `request` and `response` objects."""
response = kwargs.pop("response", None)
self.response = response
self.request = kwargs.pop("request", None)
if response is not None and not self.request and hasattr(response, "request"):
self.request = self.response.request
super().__init__(*args, **kwargs)
若要包含响应,必须使用命名参数 (**kwargs) 创建 RequestException。exp_obj
exp_obj = RequestException(response=response)
在你的情况下,你应该这样做。
>>> response = requests.get("https://httpstat.us/404")
>>> exp_obj = RequestException(response=response)
>>> vars(exp_obj))
{'response': <Response [404]>, 'request': <PreparedRequest [GET]>}
>>> exp_obj.response.status_code
404
评论