从Rust的闭包内部传播错误

时间:2019-06-11 02:21:42

标签: multithreading error-handling rust

我想从调用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`

1 个答案:

答案 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}}

Playground