#thiserror #declarative-macro #error #error-message #compilation #replace #who

thiserror_lite

几乎可以无缝替换 thiserror,完全使用声明式宏实现

1 个不稳定版本

0.1.0 2021 年 3 月 4 日

#2461 in Rust 模式

每月 49 次下载
2 crates 中使用

MIT 许可证

13KB
279 代码行

您是一个关注依赖关系的库作者,在手动实现所有错误处理模板代码和牺牲编译时间(syn、proc-macro2)使用 thiserror 之间犹豫不决吗?

不必再担心,因为 thiserror_lite 几乎可以无缝替换 thiserror,没有编译速度的影响,也没有任何依赖。thiserror_lite 在 dtolnay 的 thiserror crate 的基础上,通过使用 100% 声明式宏重新实现了大多数功能。

优势

  • 编译时间更快
  • 相同的语法 [稍后检查]
  • 通过 thiserror 的完整测试套件,当 [考虑](INSERT LINK) 稍微的 [使用差异](INSERT LINK) 和 [错误信息差异](INSERT LINK) [稍后检查]

在此处插入演示从 thiserror 迁移到 thiserror_lite 的视频

此外,名称是否应更改为 thaterror 或其他名称?

注意事项

由于 Rust 的声明式宏系统(macro_rules!)的限制,做出了一些权衡

格式字符串中访问变体字段的方式不同

thiserror 需要您使用点前缀字段名称

#[derive(thiserror::Error, Debug)]
pub enum Error {
	#[error("x^2 = {}", .x * .x)]
	SomeNumber { x: i32 },
}

thiserror_lite 移除了点

#[derive(thiserror::Error, Debug)]
pub enum Error {
	#[error("x^2 = {}", x * x)]
	SomeNumber { x: i32 },
}

如果您使用了此功能,则需要在将代码从 thiserror 迁移到 thiserror_lite 时相应地调整代码

没有 derive 宏

Rust 宏无法提供 #\[derive\] 功能。因此,thiserror_lite 使用包装宏替换了 thiserror 中的 #[derive(thiserror::Error)] 概念

thiserror_lite::err_enum! {
	pub enum Error {
		// ...
	}
}

错误枚举中不支持泛型或生命周期

由于我在实现细节上遇到了难题,thiserror_lite 不支持在生成的枚举上使用泛型或生命周期 [稍后检查]

枚举元组变体中最多两个字段

不支持具有超过两个 [稍后检查] 字段的枚举元组变体

没有运行时依赖