我想从调用thread::spawn
内的闭包内部调用的函数传播错误。
我尝试使用JoinHandle
来捕获thread::spawn
的结果,但是这样做会遇到各种错误。
fn start_server(args) -> Result<(), Box<dyn std::error::Error>> {
...
thread::spawn(move || {
// I want to do this (put a ? after run_server)
run_server(args)?;
...
}
...
});
fn run_server(args) -> Result<(), std::io::Error> {
...
}
我收到此消息
| run_server(args)?;
| ^^^^^^^^^^^^^^^^^ cannot use the `?` operator in a function that returns `()`
|
= help: the trait `std::ops::Try` is not implemented for `()`
= note: required by `std::ops::Try::from_error`
答案 0 :(得分:1)
我想从调用thread :: spawn的闭包内部调用的函数传播错误
由于线程是并行运行的,因此从线程范围抛出错误是没有意义的。更好的方法是在线程本身中进行错误处理。
因此,通常不应将错误传播到线程上方的上层。
不过,在将error
threads
放到joined
之后,您可以将平行得到的main thread
丢到fn start_server() -> Result<(), Box<std::error::Error>> {
let x = std::thread::spawn(move || -> Result<(), std::io::Error> {
run_server()?;
Ok(())
});
x.join().unwrap()?; // Now you can throw your error up because you joined your thread.
// ...
Ok(())
}
fn run_server() -> Result<(), std::io::Error> {
Err(std::io::Error::new(std::io::ErrorKind::Other, "hello"))
}
fn main() {
let x = start_server();
println!("{:?}", x);
}
中。这样就很像同步中的错误传播。
您可以通过以下方式对其进行管理:
{{1}}