本技能针对 Flutter/Dart 项目约定错误处理方式:可恢复失败应作为带类型的值在层间流动,并被穷尽 switch 处理;只有真正的缺陷与不可恢复状态才抛出,由全局网捕获一次。
用途:统一纯逻辑、仓库(repository)与 UI 之间的错误词汇,防止底层异常泄漏到 Notifier 或 widget,并确保用户手输数据不丢失。
主要能力与规则:
- 使用手写、零依赖的密封 Result<T, F extends Failure>(Ok/Err)与按边界划分的密封 Failure,每个子类型携带稳定 code 与类型化参数,绝不含本地化字符串。也允许整体采用 result_dart,但不得两者混用。
- 用 switch 穷尽处理失败,禁止 default: 或 case _:,新增失败子类型应成为编译错误。
- 在边界转换:先记录原始异常与堆栈,再返回类型化错误;窄范围 catch,禁止空 catch、裸 catch 与 throw e(应 rethrow),禁止捕获 Error 子类型。
- 纯逻辑保持全函数,不抛出;不确定性作为显式输出。
- 抛出的内容只应是 bug 或不可恢复状态,交由全局网(FlutterError.onError 与 PlatformDispatcher.instance.onError,由 app-startup-and-bootstrap 负责安装)。Isolate.run/compute 的错误需在调用处重新包成 Result。
- 仅在本地记录日志,采用大小上限的轮转文件与用户触发的“导出诊断”。
- 防丢数据:多表变更每 mutation 一个 transaction,进行中的表单状态按防抖写入草稿表,删除采用 is_deleted 软删除并置于单一共享过滤之后,提供 SnackBar Undo。
使用方式:按需阅读 references/result-failure-spine.md、references/mechanism-selection.md、references/never-lose-data.md;提交 PR 前运行 scripts/check-swallowed-catch.sh 与 scripts/check-softdelete-parity.sh。
适用场景:Flutter 应用的数据访问、状态管理与 UI 错误反馈链路。
限制:具体脚本内容、依赖版本与完整配置暂未提供;相关技能如 async-safety、state-management-riverpod 等仅作引用,未在本资料中展开。