Python中如何在不修改raise_for_status()前提下捕获异常及状态码
捕获raise_for_status抛出的异常及状态码
不需要修改原raise_for_status()方法的代码,直接用try/except块捕获异常,就能提取出状态码,具体实现如下:
基础实现代码
try: # 替换成你实际调用raise_for_status的对象,比如response.raise_for_status() your_response_obj.raise_for_status() except Exception as err: # 两种方式获取状态码 # 方式1:从异常的response属性提取(最可靠,原方法抛出时传入了response=self) if hasattr(err, 'response'): status_code = err.response.status_code # 方式2:兼容原Python 2风格的raise语法,从args中取第一个元素 else: status_code = err.args[0] if err.args else None # 处理捕获到的信息 print(f"捕获到异常,状态码:{status_code}") print(f"异常详情:{str(err)}")
更精准的捕获方式
如果你明确知道抛出的是HTTPError,可以直接捕获该异常类型,代码更清晰:
# 根据你的实际模块导入HTTPError,比如如果是requests库的话: # from requests.exceptions import HTTPError try: your_response_obj.raise_for_status() except HTTPError as err: # 直接从response属性获取状态码 status_code = err.response.status_code print(f"状态码 {status_code}:{err}")
关键说明
- 原方法使用的是Python 2风格的
raise语法(raise self.status_code, HTTPError(...)),但在Python 3中捕获时依然可以正常获取异常对象。 - 优先通过
err.response.status_code获取状态码,因为原方法抛出HTTPError时已经把包含状态码的self(即响应对象)传入了异常,这是最稳定的获取方式,不受raise语法的影响。
内容的提问来源于stack exchange,提问作者iDev
相关产品推荐
相关产品推荐

