5 个稳定版本

2.1.1 2024 年 3 月 27 日
2.1.0 2023 年 10 月 20 日
2.0.0 2023 年 10 月 19 日
1.1.1 2023 年 10 月 19 日

#3 in #析构函数


用于 heckmv

MIT 许可证

8KB
61

勘误表

勘误表是一个用于简化您二进制crate中错误的crate。问题出现在如下代码中

fn main() {
    let user_input = "abc";
    let number: i32 = user_input
        .parse()
        .expect("Invalid user input"); // this isn't viable in production
}

在这种情况下,您可能会得到如下结果

thread 'main' panicked at src/main.rs:8:10:
Invalid user input: ParseIntError { kind: InvalidDigit }
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace

这是一个难看的错误。不幸的是,您的唯一选择是添加辅助代码来确保输入有效,并在输入无效时打印有用的错误消息。这不仅可能变得冗长,而且如果您想要调用析构函数,这也很困难;如果您有未刷新更改的打开文件,那么在程序不正确退出时,这些更改可能会丢失。

进入勘误表

勘误表可以正确处理,您无需这样做。使用一些 unwind 魔法(见下文),勘误表可以在安全网中捕获您的 panic 并优雅地打印它们。由于 panic(通常)会 unwind,这会调用您需要的所有析构函数,但勘误表会优雅地打印您的错误。

以下是使用勘误表的先前示例

use errata::FallibleExt;

#[errata::catch]
fn main() {
    let user_input = "abc";
    let number: i32 = user_input
        .parse()
        .fail("Invalid user input"); // now, this prints a nice error message!
}

当此代码失败时,这里是输出

Invalid user input: invalid digit found in string

多么好! fail 也适用于 Option,唯一的区别是省略了冒号及其后面的部分(例如 无效的用户输入)。

如果您想在任意点抛出错误,也可以使用 error! 宏,这本质上是一个格式化打印的 panic!

正常 panic

正常 panic,例如由 unwrapexpectpanic! 引起的 panic,也被处理。它会打印与 Rust 产生的类似错误消息,包括错误位置以及可选的回溯。这确保了意外错误仍然为您提供有用的信息。

颜色

您可以通过启用 color 功能标志来启用颜色,这将使 failerror! 都以粗体红色打印。如果您想看到更多内置颜色支持,请随时提交 PR 或问题。

它是如何工作的

在底层,勘误表将您的代码包装在 catch_unwind 中,这意味着它可以捕获 panic 并在退出前优雅地打印它们。

由于它在 catch_unwind 中运行,您的析构函数将被调用,并且您的错误将被捕获。这是通过覆盖默认的恐慌处理程序(以抑制恐慌信息)并根据错误类型稍微不同地处理错误来实现的。

遗憾的是,由于缺乏有关恐慌负载类型的详细信息,并不是每个恐慌都能得到整洁的处理。然而,99% 的时间您将处理 String&str 负载,这些负载是得到整洁处理的。

依赖项

~275–730KB
~17K SLoC