4 个版本
0.1.3 | 2022 年 5 月 1 日 |
---|---|
0.1.2 | 2021 年 11 月 13 日 |
0.1.1 | 2021 年 2 月 22 日 |
0.1.0 | 2021 年 2 月 22 日 |
在 Rust 模式 中排名 700
每月下载量 599
40KB
409 行代码(不含注释)
Human Errors
让用户生活更轻松的错误
此包提供了一个 Error
类型,它被设计为帮助用户通过您的应用程序而不是阻止他们的进度。它从根本上假设任何失败都可以减轻(即使这意味着在 GitHub 上创建一个问题),向您的用户解释如何做到这一点是让他们重新开始最快的方式。
特性
- 创建错误时,如何解决问题是一个基本要求,这使得开发者在编写代码时考虑用户体验。
- 包装允许您暴露因果链,可能包含来自堆栈多个层的建议 - 使用户更好地了解失败的原因以及如何修复它。
- 与
std::error::Error
类型的集成允许您将任何可Box
的错误包装到因果链中,并提供额外的上下文。
示例
use std::fs;
use human_errors::{user_with_internal, Error};
fn main() {
match read_file() {
Ok(content) => println!("{}", content),
Err(err) => eprintln!("{}", err),
}
}
fn read_file() -> Result<String, Error> {
fs::read_to_string("example.txt").map_err(|err| user_with_internal(
"We could not read the contents of the example.txt file.",
"Check that the file exists and that you have permission to access it.",
err
))?
}
上面的代码可能导致以下错误
Oh no! We could not read the contents of the example.txt file.
This was caused by:
File Not Found
To try and fix this, you can:
- Check that the file exists and that you have permission to access it.
转换
当处理来自其他包和标准库的错误时,您可能会发现将 From<OtherError>
转换实现为 human_errors
错误类型是有价值的。
为了尽可能简化这一点,我们公开了一个辅助宏,该宏将在您的模块中构建一个人类错误包装器,然后可以轻松扩展。此宏将发布您熟悉的所有辅助函数,包括
user
user_with_cause
user_with_internal
system
system_with_cause
system_with_internal
这些辅助方法生成的错误将是您提供的类型(下面示例中的 MyError
)。
error_shim!(MyError);
impl From<std::num::ParseIntError> for MyError {
fn from(err: std::num::ParseIntError) -> Self {
user_with_internal(
"We could not parse the number you provided.",
"Make sure that you're providing a number in the form 12345 or -12345.",
err,
)
}
}