#error #macro #tracing #error-handling #file-io

ez-err

一个支持优雅且快速错误处理的简单错误处理库

1个不稳定版本

0.1.3 2022年5月11日
0.1.2 2022年5月11日
0.1.1 2022年5月11日
0.1.0 2022年5月11日

#2398 in Rust模式

MIT 许可证

39KB
681

Crates.io MIT licensed API

ez-err

本软件包的目标是添加简单易用的错误处理功能。获取完整功能集所需的样板代码量应尽可能少。Ez-err在错误类型中直接包含堆栈跟踪信息,以处理Err情况(如果Ok,几乎无开销)。此方法特别适用于可能延迟错误传播的任何情况(代码将Result存储在Vec中,稍后再检查它们是否为Ok)。它还值得看看egeteget_mut,它们提供了包含更多错误信息的更高级的错误消息。

用例

本软件包可用于通用错误处理。然而,在不需要在最终产品中包含任何原因的源代码信息的场景中,它可能很有用。仅依赖于ez-err进行错误处理将提供对错误输出的完全控制。禁用堆栈跟踪收集也将从使用ez-err生成的二进制文件中移除任何源代码信息。

如何使用/示例

要使用ez-err,您需要在源文件中添加 use ez_err::prelude::*。完成此操作后,您可以在函数中使用自定义的 Result<T> 类型,然后通过使用 xxx.loc(flc!())? 来处理所有错误。在将任何错误类型转换为 EzError 时,也可以使用相同的模式。

use ez_err::prelude::*;
use std::io::Write;
fn save_log_output(log: String) -> Result<()> {
    // Try to open the file or return an error with stack trace.
    let mut file = std::fs::File::open("...").loc(flc!())?;
    // Try to write to the file or return an error with stack trace.
    write!(&mut file, "{}", log).loc(flc!())?;
    // Everything went well without an error.
    Ok(())
}
fn quit(log: String) {
    // Print the error to the console if there is any.
    let _optional_return: Option<()> = save_log_output(log).handle();
}

它是如何工作的?

xxx.loc(flc!())? 由三部分组成:函数 loc,宏 flc!,以及标准运算符 ?。宏 flc! 将首先展开为一个包含宏调用位置源代码信息的 ConstLocation,这个信息将被传递给函数 loc,该函数将仅在当前是 Err 时存储位置,以最小化开销。然后,标准运算符 ? 将执行已存在的错误传播逻辑。这种方法不需要特殊的回溯配置,并且可以生成干净的堆栈跟踪。它应该非常快,因为它在 Ok 情况下编译为仅一个额外的 if 语句。

为什么我应该使用ez-err?

这个crate与其它crate相比的优势在于其简洁性。其他错误处理crate需要手动添加错误原因,这可能很有用,但往往过于复杂。以下是一个示例,展示了这个crate与一个流行的crate(error-chain)之间的区别

fn error_producer() -> Result<i32> { /* ... */ }
// Propagate an error using error-chain
fn use_error_chain() -> Result<i32> {
    /* ... */
    let value: i32 = error_producer().chain_err(|| "error when getting value")?;
    Ok(value + 1)
}
// Propagate an error using ez-err
fn use_ez_err() -> ez_err::Result<i32> {
    /* ... */
    let value: i32 = error_producer().info(flc!())?;
    Ok(value + 1)
}

特性

  • log - 启用与 log crate 的兼容性。代码默认将输出到 error!(...)
  • no_stacktrace - 禁用任何堆栈跟踪收集。这可能在一个可能泄露源信息的问题场景中很有用。

许可

本项目受 MIT 许可 许可。

贡献

您有意提交以包含在本工作中的任何贡献,都应按MIT许可,不附加任何额外条款或条件。

特别感谢

本项目是CrushDepth开发的一系列工具之一。请随意查看我们的项目之一

依赖项

~22KB