Python多Except块执行逻辑疑问及超时错误处理需求
Python try/except 执行逻辑及你的代码问题解析
一、try/except 核心执行逻辑
当try块抛出异常时,Python会按从上到下的顺序检查每个except块,找到第一个能匹配该异常的块执行,执行完后直接跳出整个try/except结构,后续的except块不会再被执行。
二、你的两段代码问题分析
第一段代码的问题
这段代码确实无法正常运行,问题有两个:
- 如果
request()调用本身抛出Timeout异常,变量r根本没完成赋值,在except块里访问r会直接触发NameError。 - 写法错误:
r.Timeout不是判断Timeout异常的正确方式,Timeout是requests库的异常类(requests.exceptions.Timeout),不是response对象的属性。
第二段代码的问题
这段代码逻辑完全错误:
except r.Timeout:同样存在r未定义的风险,如果request()抛出Timeout,r还没创建,这里会报错。- except块顺序错误:
Exception是所有异常的父类,把它放在前面的话,Timeout异常会被第一个except Exception捕获,后面的except r.Timeout永远不会被执行。
三、正确实现代码示例
结合requests库的异常体系,正确的写法应该是先捕获具体的Timeout异常,再捕获其他通用异常:
import requests def _parse_json(e): # 这里是你的解析逻辑 return {"error": str(e)} try: r = requests.request( method="POST", url="你的接口地址", # 其他参数... timeout=5 # 设置超时时间 ) r.raise_for_status() # 触发HTTP状态码异常 resp = r.json() errored = False except requests.exceptions.Timeout: # 捕获超时异常,设置errored为False resp = {"error": "请求超时"} errored = False except Exception as e: # 捕获其他所有异常,设置errored为True resp = _parse_json(e) errored = True
四、补充说明
- 捕获异常时,永远先写具体的异常类,再写通用的Exception,避免具体异常被父类异常提前捕获。
- requests库的常见异常类包括:
Timeout(超时)、ConnectionError(连接错误)、HTTPError(HTTP状态码错误,由raise_for_status()触发)等,都在requests.exceptions模块下。
内容的提问来源于stack exchange,提问作者user90823745
相关产品推荐
相关产品推荐

