gpt4 book ai didi

error-handling - 有没有办法在任意 `.backtrace()` 特征对象上获取 SNAFU 的 `&dyn std::error::Error`?

转载 作者:行者123 更新时间:2023-11-29 08:28:22 26 4
gpt4 key购买 nike

RFC 2504将添加一个必需的 fn backtrace(&self) -> Option<&Backtrace>所有 std::error::Error .这还没有准备好,所以现在,SNAFU ,一个错误辅助宏,通过绑定(bind) ErrorCompat 来填充它宏生成的所有类型的特征。这允许在每晚登陆 Rust 之前提供回溯支持。

然而,这 ErrorCompat std::error::Error 的所有实现者都没有实现特性.我想——在一些通用的错误打印代码中——能够显示原因链以及与实例化 SNAFU 错误的位置相关联的堆栈跟踪。不幸的是, source() 函数返回 &(dyn Error + 'static) .

use std::error::Error as StdError;
use snafu::{ResultExt, ErrorCompat};

fn main() {
let err: Result<(), _> = Err(std::io::Error::new(std::io::ErrorKind::Other, "oh no!"));

let err = err.with_context(|| parse_error::ReadInput {
filename: "hello"
});

let err = err.with_context(|| compile_error::ParseStage);

// some generic error handling code
if let Err(err) = err {
// `cause` is type &(dyn std::error::Error + 'static)
let cause = err.source().unwrap();

if let Some(err) = /* attempt to downcast cause into &dyn snafu::ErrorCompat trait object */ {
println!("{}", err.backtrace().unwrap());
}
}
}

pub mod compile_error {
use snafu::{Snafu, Backtrace};
#[derive(Debug, Snafu)]
#[snafu(visibility(pub(super)))]
pub enum Error {
#[snafu(display("Error parsing code: {}", source))]
ParseStage {
source: crate::parse_error::Error,
backtrace: Backtrace
},
}
}

pub mod parse_error {
use snafu::{Snafu, Backtrace};
#[derive(Debug, Snafu)]
#[snafu(visibility(pub(super)))]
pub enum Error {
#[snafu(display("Could not read input {:?}: {}", filename, source))]
ReadInput {
filename: std::path::PathBuf,
source: std::io::Error,
backtrace: Backtrace
},
}
}

我看过 std::any::Any::downcast_ref但这是为了向下转换为结构,而不是将特征对象向下转换为另一个特征对象。我想避免在我的错误处理代码中列出所有可能的具体类型的 SNAFU 错误。

在(完全)实现 RFC 2504 之前,我可以冷冻自己,但肯定有某种方法可以做到这一点。

最佳答案

一个 dyn ErrorError 的方法,没有别的。如果无法从这些方法中推导出回溯,那么这些信息还能从哪里来?

不幸的是RFC 2504尚未稳定,因此如果您想等待,则需要低温冷冻至至少 Rust 1.39。

关于error-handling - 有没有办法在任意 `.backtrace()` 特征对象上获取 SNAFU 的 `&dyn std::error::Error`?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58030888/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com