0

0

Python 异常捕获的粒度控制原则

舞夢輝影

舞夢輝影

发布时间:2026-02-18 16:33:10

|

536人浏览过

|

来源于php中文网

原创

异常捕获应以“可恢复的最小业务单元”为边界,如一次支付或下单流程;避免为单行转换操作单独try,禁用except:和except exception:,自定义异常需分层且以error结尾,捕获后须做状态清理或补偿。

python 异常捕获的粒度控制原则

try 块该包多大?按业务步骤,不是按代码行数

异常捕获不是越细越好,也不是图省事一把全包——关键看哪一步失败后你还能“兜得住”。比如用户下单,扣库存生成订单发MQ消息这三步是一体的,中间任何一环失败都得整体回滚;这时候把整个流程包进一个 try,统一捕获 InventoryErrorMessageSendError,比在每行 redis.decr() 前都加个 try-except 强得多。

  • ✅ 推荐:以“可恢复的最小业务单元”为边界,比如一次支付、一次文件上传、一次配置加载
  • ❌ 避免:为 json.loads()int()dict.get() 单独套 try——它们本就该用更轻量方式处理(如 try/except ValueError 只包这一句,不连带后续逻辑)
  • ⚠️ 风险:粒度太碎会让错误被静默吞掉,日志里只看到“某处报了 KeyError”,但不知道它发生在下单前还是发货后

为什么不能写 except:except Exception:

因为它们会吃掉你不该拦的信号。比如用户按 Ctrl+C 想中断脚本,except: 会把它当成普通异常吞掉,程序卡住不动;而 except Exception: 虽放行 KeyboardInterrupt,却仍会拦截 SystemExit,导致 sys.exit() 失效——这在 CLI 工具或容器健康检查里是致命的。

  • ✅ 安全写法:except (ValueError, OSError, requests.exceptions.Timeout) —— 明确知道要处理什么
  • ✅ 真需要兜底?只在最外层日志/清理场景用 except BaseException:,且必须 if isinstance(e, (KeyboardInterrupt, SystemExit)):raise
  • except: 在任何生产代码里都不该出现,它等价于 except BaseException:,风险极高

自定义异常怎么抛、怎么接?底层具体,上层策略化

不要让数据库模块返回 None 表示查不到用户,也不要让 API 层自己判断 if resp.status_code == 404。异常要分层:底层暴露细节,上层决定怎么应对。

Unreal Images
Unreal Images

免费的AI图片库

下载
  • ✅ 底层(如 DAO)抛 UserNotFoundErrorDatabaseConnectionError —— 类型明确,不模糊
  • ✅ 上层(如 FastAPI 路由)捕获 UserNotFoundError 返回 HTTP_404,捕获 DatabaseConnectionError 返回 HTTP_503 并触发告警
  • ⚠️ 注意:自定义异常类名必须以 Error 结尾(如 InsufficientBalanceError),继承 Exception,别直接继承 BaseException
  • ? 小技巧:模块内先定义一个 BaseAppError,其他业务异常都继承它,方便上层统一 except BaseAppError: 做基础日志

捕获之后,状态清理和补偿比打印日志更重要

catch 到异常不等于问题结束。你要立刻问自己:刚才那几行代码,有没有留下“半成品”?文件写了一半?数据库插入了订单但没扣库存?消息发出去但没收到 ACK?

立即学习Python免费学习笔记(深入)”;

  • ✅ 优先用 with 管理资源:文件、数据库连接、锁,确保 finally 或上下文退出时自动释放
  • ✅ 多步操作考虑幂等性:比如订单号带时间戳+随机数,重复提交不会创建两单;或者失败时写入延迟队列,由后台重试
  • ⚠️ 不要只写 logging.exception("oops") 就完事——得补一句 rollback_transaction()delete_temp_file(),否则下次运行可能踩进同一个坑

粒度控制最难的地方不在语法,而在对业务副作用的预判。同一段代码,在定时任务里可能要强清理,在 Web 请求里可能要快速降级,在 CLI 工具里可能得精确提示用户哪里填错了——没有银弹,只有根据上下文做取舍。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

442

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

544

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

322

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

81

2025.09.10

Python FastAPI异步API开发_Python怎么用FastAPI构建异步API
Python FastAPI异步API开发_Python怎么用FastAPI构建异步API

Python FastAPI 异步开发利用 async/await 关键字,通过定义异步视图函数、使用异步数据库库 (如 databases)、异步 HTTP 客户端 (如 httpx),并结合后台任务队列(如 Celery)和异步依赖项,实现高效的 I/O 密集型 API,显著提升吞吐量和响应速度,尤其适用于处理数据库查询、网络请求等耗时操作,无需阻塞主线程。

28

2025.12.22

Python 微服务架构与 FastAPI 框架
Python 微服务架构与 FastAPI 框架

本专题系统讲解 Python 微服务架构设计与 FastAPI 框架应用,涵盖 FastAPI 的快速开发、路由与依赖注入、数据模型验证、API 文档自动生成、OAuth2 与 JWT 身份验证、异步支持、部署与扩展等。通过实际案例,帮助学习者掌握 使用 FastAPI 构建高效、可扩展的微服务应用,提高服务响应速度与系统可维护性。

223

2026.02.06

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

817

2023.08.22

scripterror怎么解决
scripterror怎么解决

scripterror的解决办法有检查语法、文件路径、检查网络连接、浏览器兼容性、使用try-catch语句、使用开发者工具进行调试、更新浏览器和JavaScript库或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

371

2023.10.18

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

561

2026.02.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.4万人学习

Django 教程
Django 教程

共28课时 | 4.4万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号