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
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,例如由 unwrap
、expect
和 panic!
引起的 panic,也被处理。它会打印与 Rust 产生的类似错误消息,包括错误位置以及可选的回溯。这确保了意外错误仍然为您提供有用的信息。
颜色
您可以通过启用 color
功能标志来启用颜色,这将使 fail
和 error!
都以粗体红色打印。如果您想看到更多内置颜色支持,请随时提交 PR 或问题。
它是如何工作的
在底层,勘误表将您的代码包装在 catch_unwind
中,这意味着它可以捕获 panic 并在退出前优雅地打印它们。
由于它在 catch_unwind
中运行,您的析构函数将被调用,并且您的错误将被捕获。这是通过覆盖默认的恐慌处理程序(以抑制恐慌信息)并根据错误类型稍微不同地处理错误来实现的。
遗憾的是,由于缺乏有关恐慌负载类型的详细信息,并不是每个恐慌都能得到整洁的处理。然而,99% 的时间您将处理 String
或 &str
负载,这些负载是得到整洁处理的。
依赖项
~275–730KB
~17K SLoC