首页 > 解决方案 > 当我尝试加入恐慌线程时,“Err”中有什么?

问题描述

下面的代码是一个非常简化的版本。在这个演示中,线程handle恐慌。主线程想要加入handle,所以它会得到一个 Err.

use std::thread;
fn main() {
    let handle = thread::spawn(|| {
        panic!("panic in thread");
    });
    match handle.join() {
        Ok(_) => println!("panic in main, Ok"),
        Err(e) => println!("panic in main, Err {:?}", e),
    }
}

但是,它只打印panic in main, Err Any { .. }关于返回Err的不包含任何信息的信息。

我的问题是:

  1. 这里面有什么Err
  2. 是否Err(e)包含任何可以告诉我有关第一次恐慌的任何信息?在这种情况下,我可以解析一些Err(e)我可以从中找到线程handle失败的东西panic!("panic in thread")吗?

标签: rust

解决方案


方法的文档join特别说,Err它将包含给予panic. 因此,如果您从以下位置检索 '&str' 值,则上面的示例有效Any

Err(e) => println!("panic in main, Err {:?}", e.downcast_ref::<&str>())

// -> panic in main, Err Some("panic in thread")

但是,如果您使用格式,则 in 的值ErrString&str

panic!("Panic message: {}", "oh no!!!");

...

// to get the message above you need to use
Err(e) => println!("panic in main, Err {:?}", e.downcast_ref::<String>())

推荐阅读