1个不稳定版本
0.1.3 | 2022年5月11日 |
---|---|
0.1.2 |
|
0.1.1 |
|
0.1.0 |
|
#2398 in Rust模式
39KB
681 行
ez-err
本软件包的目标是添加简单易用的错误处理功能。获取完整功能集所需的样板代码量应尽可能少。Ez-err在错误类型中直接包含堆栈跟踪信息,以处理Err
情况(如果Ok
,几乎无开销)。此方法特别适用于可能延迟错误传播的任何情况(代码将Result
存储在Vec
中,稍后再检查它们是否为Ok
)。它还值得看看eget
和eget_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