如何从异常对象获取status_code

How to get status_code from an exception object

提问人:Abhiram Devisetti 提问时间:11/16/2023 更新时间:11/16/2023 访问量:48

问:

在我的代码中,我有一个 get 请求,如下所示:

response = requests.get(url)

对于无效的状态代码,即非 2xx,会引发异常,

exp_obj = RequestException(response)

现在我想从这个异常对象中获取状态代码exp_obj

我试过了,但我得到了exp_obj.response.status_codeAttributeError: 'NoneType' object has no attribute 'status_code'

如果我打印exp_obj它与响应对象相同,即<Response [500]>

Python 异常 httprequest httpresponse http-status-codes

评论

0赞 Codist 11/16/2023
显然,exp_obj.response 是 None
0赞 Abhiram Devisetti 11/16/2023
为什么没有,那么有没有其他方法可以得到status_code呢?

答:

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_objexp_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