use*_*855 4 error-handling backtrace rust
我如何开始Backtrace与 SNAFU 合作?我尝试过,但我只是得到空的回溯。文档似乎很少。
return Error::SampleError {
msg: "foo".to_string(),
backtrace: Backtrace::generate(),
};
Run Code Online (Sandbox Code Playgroud)
印刷
return Error::SampleError {
msg: "foo".to_string(),
backtrace: Backtrace::generate(),
};
Run Code Online (Sandbox Code Playgroud)
这是从调用堆栈中很深的函数中抛出的。
让我们从这个最小的、可重现的示例开始:
\n\nuse snafu::Snafu;\n\n#[derive(Debug, Snafu)]\nenum Error {\n SampleError { msg: String },\n}\n\ntype Result<T, E = Error> = std::result::Result<T, E>;\n\nfn alpha() -> Result<()> {\n beta()\n}\n\nfn beta() -> Result<()> {\n gamma()\n}\n\nfn gamma() -> Result<()> {\n SampleError { msg: "foo" }.fail()\n}\nRun Code Online (Sandbox Code Playgroud)\n\n请注意,它使用上下文选择器 SampleError和方法fail,而不是直接使用枚举变量来构造错误。
现在我们将snafu::Backtrace其导入并添加到我们的错误中,并命名它backtrace(如果您必须将其称为其他名称,请参阅控制回溯)。
use snafu::{Snafu, Backtrace};\n\n#[derive(Debug, Snafu)]\nenum Error {\n SampleError { msg: String, backtrace: Backtrace },\n}\nRun Code Online (Sandbox Code Playgroud)\n\n如果这是一个图书馆,那就是你应该停下来的地方。如果二进制文件认为回溯是值得的,那么您的错误现在可以选择启用回溯。这样做是因为 Rust 中的回溯尚未稳定,因此 SNAFU 必须与多种可能的实现兼容。
\n\n如果您正在控制二进制文件,则需要决定如何实现回溯。通过功能标志选择三种主要实现:
\n\nbacktraces\xe2\x80\x94 提供不透明Backtrace类型backtraces-impl-backtrace-crate\xe2\x80\x94 使用第三方回溯包。snafu::Backtrace只是 的别名backtrace::Backtrace。unstable-backtraces-impl-std\xe2\x80\x94 使用不稳定的标准库Backtrace。snafu::Backtrace只是 的别名std::backtrace::Backtrace。一旦您选择了实现功能标志,请将其添加到您的 Cargo.toml 中:
\n\n[dependencies]\nsnafu = { version = "0.6.3", features = ["backtraces"] }\nRun Code Online (Sandbox Code Playgroud)\n\n然后,您需要在程序的高层处理错误并获取回溯并将其打印出来。这使用了该ErrorCompat特征,我鼓励您以详细的方式使用该特征,以便稍后当它在标准库中稳定时更容易将其删除:
use snafu::ErrorCompat;\n\nfn main() {\n if let Err(e) = alpha() {\n if let Some(bt) = ErrorCompat::backtrace(&e) {\n println!("{:?}", bt);\n }\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n\nuse snafu::Snafu;\n\n#[derive(Debug, Snafu)]\nenum Error {\n SampleError { msg: String },\n}\n\ntype Result<T, E = Error> = std::result::Result<T, E>;\n\nfn alpha() -> Result<()> {\n beta()\n}\n\nfn beta() -> Result<()> {\n gamma()\n}\n\nfn gamma() -> Result<()> {\n SampleError { msg: "foo" }.fail()\n}\nRun Code Online (Sandbox Code Playgroud)\n\n免责声明:我是 SNAFU 的主要作者。
\n\n您是对的,用户指南中没有对此进行彻底描述,我已经创建了一个问题来改进这一点。最相关的部分是关于功能标志的部分。
\n\nSNAFU 存储库中有多个回溯测试,您可以查看:
\n\n| 归档时间: |
|
| 查看次数: |
1005 次 |
| 最近记录: |