【Rust日报】 Rust 错误源追踪示例

tohum - 项目快速启动工具

tohum 是一个强大的命令行工具(CLI),帮助开发者使用预定义的种子模板快速启动新项目,告别重复的项目配置工作。

主要特点

  • 极速启动:基于 Rust 构建,可在数秒内完成新项目的创建,性能卓越

  • **种子仓库(Silos)**:通过仓库系统组织项目模板,便于查找。支持使用官方仓库或为团队/组织创建自定义仓库

  • 跨平台支持:可在 Linux、macOS 和 Windows 上无缝运行,支持通过 Cargo 安装或源码构建

快速开始

  1. 安装工具

    go 复制代码
    cargo install tohum

    (需要 Rust 工具链)

  2. 查看可用模板

    go 复制代码
    tohum silo list
  3. 创建新项目

    go 复制代码
    tohum plant @node/react-vite-ts my-awesome-app

可用模板示例

  • @go/cli - Go CLI 应用程序模板

  • @node/cli-ts - 配置了 TypeScript 的 Node.js 项目

  • @node/react-vite-ts - 使用 TypeScript 和 Vite 的 React 项目

项目采用 MIT 许可证开源。

https://tohum.rs/

为什么在Rust应用中使用结构化错误处理

主要观点

错误处理的心理负担

  • Rust的错误处理机制迫使开发者朝正确方向前进(思考并单独处理每个错误)

  • 尽管理性上认为这很有价值,但由于缺乏测试或倾向于忽略错误路径,样板代码常让人感觉不值得

  • 相比其他语言中随意抛出字符串异常,Rust强制执行了应该做但经常被忽视的最佳实践

堆栈跟踪的价值讨论

  • 使用结构化错误时,通过在不同上下文位置使用唯一的错误类型(如"哪个文件未找到"),错误本身就能指向唯一位置

  • 可以通过搜索上下文信息直接定位问题,调用堆栈变得不那么重要

  • 堆栈跟踪主要在调试意外panic时有用,因为panic没有手动附加的上下文

  • 对于结构化错误,错误消息中的上下文通常足以调试

样板代码的优势

  • 结构化错误可以替代手写的错误枚举文档

  • 有类型检查器的帮助,避免文档快速过时

  • 实际上样板代码就是枚举错误的过程

工具推荐

  • Snafu库提供了anyhow/thiserror的最佳结合方式

  • 提供了从字符串类型错误到具体错误类型的简便迁移路径

  • 减少了为强类型错误添加上下文的样板代码

https://reddit.com/r/rust/comments/1kx0ak8/why_use_structured_errors_in_rust_applications/

Rust 错误源追踪示例

这是一个演示如何通过追踪错误源链来揭示隐藏在错误链中的宝贵诊断信息的 Rust 代码示例。

核心概念

什么是错误源(Error Sources)?

  • 在 Rust 错误系统中,错误可以通过实现 Error::source() 方法指向其底层原因,形成错误链

  • 例如:网络错误 → IO错误 → 操作系统错误

  • 默认情况下,rootcause 只显示顶层错误信息

  • 启用源追踪后可遍历完整错误链,展示完整的诊断信息

主要功能

  1. 问题场景
  • 许多错误类型(如 reqwest::Error)会包装底层原因,但只在顶层显示通用消息

  • 这导致重要的诊断信息被隐藏

  • 解决方案

    • 通过自定义 ContextFormatterHook 启用源链追踪

    • 设置 follow_source: true 来追踪完整错误链

    • 设置 follow_source_depth: None 来追踪全部深度(无限制)

  • 示例对比

    • 不追踪源链:仅显示顶层通用错误消息

    • 追踪源链:显示完整的错误链路,包括 DNS 解析错误等详细信息

    实现要点

    • 创建 ReqwestErrorFormatter 结构体实现 ContextFormatterHook

    • 通过 Hooks::new() 安装错误格式化钩子

    • 模拟 HTTP 请求失败场景(访问不存在的域名)

    • 可为自定义错误类型实现类似功能

    应用价值

    显著提升错误诊断的清晰度和可调试性,帮助开发者快速定位问题根源。

    https://github.com/rootcause-rs/rootcause/blob/main/examples/following_error_sources.rs

    --

    From 日报小组 Mike

    社区学习交流平台订阅:

    • Rustcc论坛: 支持rss

    • 微信公众号:Rust语言中文社区

相关推荐
悠仁さん23 分钟前
【C++】vector 类
开发语言·c++
_upupup33 分钟前
智能指针的原理及简单模拟实现(C++)
开发语言·c++
打工仔折腾 AI40 分钟前
飞牛OS上用Docker Compose部署ExerciseDiary运动记录并配置远程访问
运维·人工智能·后端·python·docker·容器·ai agent 实战
en.en..41 分钟前
C语言---宏
c语言·开发语言
郝学胜-神的一滴1 小时前
C++ Templates 01:拨开迷雾,读懂C++模板经典著作
开发语言·c++·程序人生·游戏·游戏引擎·软件构建
小蒜学长1 小时前
基于Python的动物救助站管理系统的设计与实现(代码+数据库+LW)
数据库·后端·python·django·动物救助
小小张说故事1 小时前
Python 中 __new__ 和 __init__ 到底谁才是构造函数?一文讲透区别与 5 个坑
后端·python
言乐61 小时前
Python实现关税自动计算模型
开发语言·python·django·virtualenv·pygame
朝朝辞暮i1 小时前
C++ 第 14 课:引用 &
开发语言·c++·算法
用户847172102841 小时前
.shot 文件格式规范
前端·后端