通过async封装提升异步任务错误恢复力,需用create_task显式启动任务、gather配合return_exceptions=true实现并行容错、分层捕获异常、封装重试/降级策略,并响应cancellederror确保资源清理。

通过 async 封装提升异步任务的错误恢复力,核心在于让异常可捕获、可隔离、可响应。不是简单加 async/await,而是围绕任务生命周期设计容错结构。
用 task 封装协程,避免异常静默丢失
直接调用协程对象不执行,也不传播异常;用 asyncio.create_task() 显式启动任务,才能纳入事件循环调度和异常管理范围。
- ✅ 正确:创建任务后
await task,异常会原样抛出,被外层try/catch捕获 - ❌ 错误:只调用
some_async_func()不 await、不 create_task,异常会被丢弃,仅在垃圾回收时打印到 stderr - ⚠️ 注意:多个任务并行时,若用
asyncio.gather(tasks),默认任一失败即中断全部;改用return_exceptions=True可让失败结果以异常对象形式返回,不中断其他任务
分层捕获:任务内处理 + 任务外兜底
单个任务内部应处理可恢复错误(如网络超时、临时限流),而任务外部负责统一降级、重试或告警。
- 任务内:用
asyncio.wait_for(..., timeout=5)控制等待上限,配合try/except TimeoutError触发本地重试逻辑 - 任务外:对整个任务集合做
await asyncio.gather(*tasks, return_exceptions=True),再遍历结果,区分成功值与Exception实例分别处理 - 全局兜底:设置事件循环异常处理器(
loop.set_exception_handler),捕获所有未被显式 await 或检查的异常,防止服务静默崩溃
封装通用错误策略,避免重复写 try/catch
把重试、降级、日志等逻辑抽成高阶函数或装饰器,保持业务代码干净。
- 例如封装一个
@retry(max_attempts=3, delay=1)装饰器,内部自动 catch 异常、sleep、重试,并在最终失败时抛出带上下文的错误 - 对关键请求,封装为
safe_fetch(url, fallback=lambda: {"status": "offline"}),异常时自动返回预设降级数据 - 避免嵌套
try/catch:不用在每个 await 后都包一层,而是按语义边界分组——比如“获取用户”是一组,“加载订单列表”是另一组,每组一个try
明确取消语义,保障资源清理
异步任务可能被主动取消(如请求超时、用户跳转),需响应 CancelledError 并释放连接、关闭文件等。
- 所有长时间运行的协程都应在
try/finally或async with中管理资源 - 捕获
asyncio.CancelledError后,不做重试,立即清理并raise(或return),确保取消信号不被吞掉 - 使用
asyncio.shield()保护关键清理逻辑不被意外取消











