rust - 当我尝试加入恐慌线程时,“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
的不包含任何信息的信息。
我的问题是:
- 这里面有什么
Err
- 是否
Err(e)
包含任何可以告诉我有关第一次恐慌的任何信息?在这种情况下,我可以解析一些Err(e)
我可以从中找到线程handle
失败的东西panic!("panic in thread")
吗?
解决方案
方法的文档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 的值Err
将String
是&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>())
推荐阅读
- java - 如何连接同一个表中的两列
- amazon-web-services - 轮询 AWS 参数存储
- python - 根据月、年将 nx 1 数据帧转换为 axb 大小的网格
- pandas - 如何使用 sqlachemy 将限制设置为数据集的 20%
- c - 检查数组是否包含 0 到 n-1 之间的所有整数的有效方法
- c# - C#:如何在非主线程的线程中使用 LoadImage() 函数
- javascript - 对作为道具传递的函数点击做出反应,并使用 HOC 多次执行
- java - 如何在 JAVA 中使用简单的 json 访问内部 JSON 元素?
- c# - 如何更改应用程序的图标(WPF、C#)
- jquery - 在数据表响应中工作 jquery 代码的问题