| name | py2rs-review-r2-error-tracing |
| description | [DRAFT] 第 2 轮审查:统一错误与追踪体系。引入 tracing/anyhow/thiserror,让错误能定位到文件 / 函数 / 调用链。允许小改。 |
第 2 轮 · 错误与追踪审查(R2)
DRAFT(草稿状态)。具体用哪个日志框架可能改(tracing / log / slog 都有可能)。
脚手架猜想(可能会有)
rs/src/error.rs —— 统一的 AppError 枚举 + thiserror derive 的模板
rs/src/lib.rs 里的 tracing_subscriber::fmt::init() 初始化代码段
- 一个
rust-toolchain.toml ?(如果项目需要固定工具链)
reviews/r2-<module>.md 模板 —— 记录本轮引入了哪些 tracing span / error context
anyhow::Result<T> 这种全局简写是否合适,也可能在实战里被推翻。
另外:本 skill 仅处理后端代码的错误与追踪。前端 / GUI 的错误展示不属于这里。
0. 前置检查(强约束)
**本 skill 必须在 py2rs-review-r0-behavior 与 py2rs-review-r1-rust-style 均完成之后启动。**必须同时满足:
若任一未满足,本 skill 直接拒绝启动。
1. 本轮要解决的味道
迁移后的代码常见这类问题:
return Err("something failed");
let data = fetch().expect("fetch failed");
本轮把它推进到:
use thiserror::Error;
use anyhow::{Result, Context};
use tracing::{info, warn, error, info_span};
#[derive(Debug, Error)]
enum AppError {
#[error("user {0} not found")]
UserNotFound(i64),
#[error(transparent)]
Io(#[from] std::io::Error),
}
fn do_work(user_id: i64) -> Result<()> {
let span = info_span!("do_work", user_id);
let _enter = span.enter();
let data = fetch(user_id)
.with_context(|| format!("fetch failed for user {user_id}"))?;
Ok(())
}
2. 必须引入的依赖
若在 py2rs-dep-align 阶段已经加入则跳过,否则补齐:
cargo add thiserror anyhow
cargo add tracing tracing-subscriber
3. 审查清单
3.1 错误体系
3.2 日志 / 追踪
3.3 对外契约一致性
4. 允许与禁止
- ✅ 允许:引入
thiserror / anyhow / tracing,重构返回类型、增加 span、补充错误上下文
- ❌ 禁止:改变算法 / IO 模型(那是 R3)
- ❌ 禁止:改变行为语义(仍然要过 R0 行为一致性测试)
5. 结束时的交付