You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python多Except块执行逻辑疑问及超时错误处理需求

Python try/except 执行逻辑及你的代码问题解析

一、try/except 核心执行逻辑

当try块抛出异常时,Python会按从上到下的顺序检查每个except块,找到第一个能匹配该异常的块执行,执行完后直接跳出整个try/except结构,后续的except块不会再被执行。

二、你的两段代码问题分析

第一段代码的问题

这段代码确实无法正常运行,问题有两个:

  1. 如果request()调用本身抛出Timeout异常,变量r根本没完成赋值,在except块里访问r会直接触发NameError。
  2. 写法错误:r.Timeout不是判断Timeout异常的正确方式,Timeout是requests库的异常类(requests.exceptions.Timeout),不是response对象的属性。

第二段代码的问题

这段代码逻辑完全错误:

  1. except r.Timeout:同样存在r未定义的风险,如果request()抛出Timeout,r还没创建,这里会报错。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 07:30:53