如何让Rust的anyhow crate按main函数退出时的格式输出错误
问题解析与解决方案
当main函数返回anyhow::Result<()>时,输出的Error: error前缀不是anyhow crate添加的,而是Rust标准库的运行时逻辑自动处理的:
- Rust标准库会对返回
Result类型的main函数做特殊处理:如果返回Err(e),就会自动向标准错误流(stderr)输出Error:前缀,再打印错误的Debug格式表示(这也是启用回溯后能看到调用栈的原因)。
而你手动用println!("{:?}", error)打印时,只是直接输出anyhow::Error自身的Debug内容,没有额外添加前缀,所以只会显示error。
实现期望输出的两种方法
手动添加前缀并输出到标准错误流
模拟标准库的行为,自己加上Error:前缀,同时用eprintln!输出到stderr(和标准库的输出目标一致):use anyhow::anyhow; fn error() -> anyhow::Result<()> { Err(anyhow!("error")) } fn main() { if let Err(error) = error() { eprintln!("Error: {:?}", error); } }启用anyhow的回溯特性(可选)
如果需要显示错误的回溯信息,需要在Cargo.toml中启用anyhow的backtrace特性:anyhow = { version = "1.0", features = ["backtrace"] }之后用
{:?}格式打印时,就会包含完整的调用栈回溯,和main返回错误时的输出完全一致。
关于源码中前缀的位置
Error: 前缀来自Rust标准库的入口逻辑,而非anyhow的代码。你可以在Rust标准库的src/libstd/rt.rs或src/libstd/process.rs中找到相关处理:当main函数返回Err时,运行时会执行类似eprintln!("Error: {:?}", err)的代码来输出错误。
内容的提问来源于stack exchange,提问作者weisbrja
相关产品推荐
相关产品推荐

