gpt4 book ai didi

multithreading - 将 error_chain 与 JoinHandle 一起使用

转载 作者:行者123 更新时间:2023-12-03 07:51:53 25 4
gpt4 key购买 nike

我用 error_chain 对于我的错误处理。

[dependencies]
error-chain = "0.12.2"
当我只使用单线程时,我没有问题。
#[macro_use] extern crate error_chain;
error_chain! {}

fn main() -> Result<()> {
crash_burn()
.chain_err(|| "crash_burn() crashed and burned!")?;
Ok(())
}

fn crash_burn() -> Result<()> {
bail!("I'm an error.")
}
但是,当尝试从线程返回错误时,出现编译错误。
#[macro_use] extern crate error_chain;
error_chain! {}
use std::thread::*;

fn main() -> Result<()> {
let child: JoinHandle<Result<()>> = spawn(move || {
crash_burn()
.chain_err(|| "crash_burn() crashed and burned!")?;
Ok(())
});

let res = child.join()
.chain_err(|| "Child thread panicked! This error did not come from crash_burn().")?;
res // res contains the error from crash_burn()
}
这是编译错误。
error[E0599]: no method named `chain_err` found for enum `std::result::Result<std::result::Result<(), Error>, std::boxed::Box<(dyn std::any::Any + std::marker::Send + 'static)>>` in the current scope
--> src/main.rs:13:10
|
13 | .chain_err(|| "Child thread panicked! This error did not come from crash_burn().")?;
| ^^^^^^^^^ method not found in `std::result::Result<std::result::Result<(), Error>, std::boxed::Box<(dyn std::any::Any + std::marker::Send + 'static)>>`
为什么不自动处理此错误?

最佳答案

Why is this error not handled automatically?


根据 error_chain 文档

chain_err can be called on any Result type where the contained error type implements std::error::Error+Send + 'static


child.join() Result 中的错误类型是 Box<dyn Any>因为线程可能会因任何值而 panic 。
例如线程可以做
panic!(78);
但是 std::boxed::Box<dyn Any>不实现错误特征(只有错误类型实现该特征)。
但是,为了调用 err_chain,它需要实现 Error 特征。所以这就是不能使用 err_chain 的原因。

关于multithreading - 将 error_chain 与 JoinHandle 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62700780/

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