SuperAPI AI 工具集

erpnext-errors-controllers

编程与开发

查看项目

更新于 10-16 06:17

技能介绍

用途:面向 ERPNext 文档控制器(Document Controllers)的错误处理技能,讲解在控制器中如何捕获、抛出与记录错误,并说明不同生命周期钩子下事务回滚的差异。兼容 v14/v15/v16。

主要能力:控制器拥有完整 Python 能力,可使用 try/except、raise、多个 except 子句、finally、frappe.throw() 与 frappe.log_error()。资料给出错误方法对照:frappe.throw() 会停止执行、按钩子决定是否回滚、以对话框提示用户,适合校验错误;raise Exception 停止执行、显示错误页,适合内部错误;frappe.msgprint() 不停止也不回滚,用于警告;frappe.log_error() 不停止不回滚,写入 Error Log,用于调试与审计。

事务行为:validate、before_save 中 throw 会完整回滚、文档不保存;on_update、after_insert 中文档已保存,throw 只显示错误;before_submit 中 throw 会回滚并保持草稿;on_submit 中 docstatus=1,throw 只显示错误;before_cancel 回滚并保持已提交;on_cancel 中 docstatus=2,throw 只显示错误。

使用方式:资料提供多种模式,包括在 validate 中收集多条错误后一次性抛出、外部 API 调用配合超时与异常回退、on_update 中非关键操作仅记录日志、可提交文档在 before_submit 完成全部校验、取消时逐项反向操作并汇总错误、数据库操作异常处理,以及用 frappe.db.savepoint 与 frappe.db.rollback(save_point=...) 实现部分回滚。

限制与规则:不要调用 frappe.db.commit(),框架自行管理事务;不要静默吞掉异常;不要假设 on_update 能回滚文档;不要把关键逻辑放在 on_submit;错误消息建议用 _() 以支持翻译;重写方法需调用 super()。更多模式见 references/patterns.md、examples.md、anti-patterns.md。