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

Eventlet.timeout未抛出Exception类异常却终止流程,如何捕获该异常?

解决Eventlet.Timeout无法被except Exception捕获的问题

嘿,你猜得完全正确!Eventlet的Timeout异常确实不是Exception类的子类——它直接继承自Python的BaseException,这就是为什么你用except Exception抓不到它,但裸except:能捕获到的原因。

正确的捕获方式

1. 精准捕获eventlet.Timeout异常

这是最推荐的方式,既能准确捕获超时异常,又不会误抓其他无关异常:

import eventlet

# 设置20秒超时
timeout = eventlet.Timeout(20)
try:
    # 这里放你的业务代码,比如模拟一个耗时操作
    eventlet.sleep(30)  # 睡30秒,肯定会触发超时
except eventlet.Timeout as e:
    print(f"捕获到超时异常: {e}")
finally:
    # 一定要取消超时,避免影响后续代码
    timeout.cancel()

2. 同时捕获超时异常和常规业务异常

如果你需要同时处理超时和其他Exception类型的异常,可以分开写except子句,或者用元组组合:

import eventlet

timeout = eventlet.Timeout(20)
try:
    eventlet.sleep(30)
    # 模拟其他可能抛出的异常
    # raise ValueError("业务逻辑出错")
except eventlet.Timeout as e:
    print(f"超时警告: {e}")
except Exception as e:
    print(f"业务异常: {e}")
finally:
    timeout.cancel()

或者合并成一个except:

import eventlet

timeout = eventlet.Timeout(20)
try:
    eventlet.sleep(30)
except (eventlet.Timeout, Exception) as e:
    print(f"捕获到异常: {e}")
finally:
    timeout.cancel()

为什么裸except:能生效?

裸except:会捕获所有继承自BaseException的异常(包括Timeout、Exception,甚至KeyboardInterrupt、SystemExit这类系统级异常),但这种写法非常不推荐——它会让你无法通过Ctrl+C正常终止程序,还可能掩盖一些严重的系统级问题。

内容的提问来源于stack exchange,提问作者Lucas Azevedo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 06:33:43