thiserror
稍微绕了个弯,对吧?但这是必要的!现在让我们回到正轨:自定义错误类型与 thiserror
。
自定义错误类型
我们已经了解了如何为自定义错误类型“手动”实现 Error
特性。想象一下,如果你需要在代码库中的大多数错误类型上都这样做,那将产生大量的样板代码,不是吗?
通过使用 Rust 仓库 thiserror
,我们可以减少一些这样的样板代码。它提供了一个过程宏来简化自定义错误类型的创建。
#![allow(unused)] fn main() { #[derive(thiserror::Error, Debug)] enum TicketNewError { #[error("{0}")] TitleError(String), #[error("{0}")] DescriptionError(String), } }
你可以编写自己的宏
迄今为止,我们见到的所有 derive
宏都是由 Rust 标准库提供的。thiserror::Error
是第三方 derive
宏的第一个示例。
derive
宏是过程宏的一个子集,过程宏是一种在编译时生成 Rust 代码的方式。虽然在这个课程中我们不会深入探讨如何编写过程宏的细节,但重要的是要明白你可以自己编写它们!这是一个更高级的 Rust 课程中会涉及的主题。
自定义语法
每个过程宏都可以定义自己的语法,通常在仓库的文档中进行解释。以 thiserror
为例,我们有:
#[derive(thiserror::Error)]
:这是使用thiserror
协助为自定义错误类型派生Error
特性的语法。#[error("{0}")]
:这是为自定义错误类型的每个变体定义Display
实现的语法。{0}
在错误被显示时会被变体的第零个字段(在此例中为String
)替换。
参考资料
- 本节练习位于
exercises/05_ticket_v2/12_thiserror