#error #user #focused #human #problem #experience #advice

human-errors

一个专注于为用户提供任何问题相关建议的错误库

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

Download history 174/week @ 2024-03-13 317/week @ 2024-03-20 76/week @ 2024-03-27 35/week @ 2024-04-03 42/week @ 2024-04-10 118/week @ 2024-04-17 171/week @ 2024-04-24 203/week @ 2024-05-01 117/week @ 2024-05-08 184/week @ 2024-05-15 151/week @ 2024-05-22 72/week @ 2024-05-29 164/week @ 2024-06-05 111/week @ 2024-06-12 182/week @ 2024-06-19 103/week @ 2024-06-26

每月下载量 599

MIT 许可证

40KB
409 行代码(不含注释)

Human Errors crate docs

让用户生活更轻松的错误

此包提供了一个 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,
        )
    }
}

无运行时依赖