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