Rust中join发生panic的线程时返回的Err包含什么内容?
问题解答
1. Err中实际存储的内容
join()方法返回的Err变体承载的是线程panic时抛出的payload,类型为Box<dyn Any + Send + 'static>:
- 默认调用
panic!(字符串内容)时,如果传入的是字符串字面量,payload的实际类型就是&'static str - 如果传入的是格式化生成的字符串(比如
panic!("error code: {}", 500)),payload的实际类型就是String - 你也可以自定义任意满足
Any + Send + 'static约束的类型作为panic payload传入。
你之前输出看到的Any { .. }只是dyn Any类型的默认Debug格式化结果,不代表内部没有存储有效信息。
2. 能否提取panic的具体触发信息
完全可以,只需要对拿到的Err(e)做类型向下转换(downcast)即可还原出原始的panic内容。
你可以用如下修改后的代码验证:
use std::any::Any; use std::thread; fn main() { let handle = thread::spawn(|| { panic!("panic in thread"); }); match handle.join() { Ok(_) => println!("线程执行正常结束"), Err(e) => { // 尝试向下转换为字符串字面量类型 if let Some(&panic_msg) = e.downcast_ref::<&'static str>() { println!("捕获到线程panic,信息:{}", panic_msg); // 尝试向下转换为动态生成的String类型 } else if let Some(panic_msg) = e.downcast_ref::<String>() { println!("捕获到线程panic,信息:{}", panic_msg); // 其他自定义payload类型的处理逻辑可以在此补充 } else { println!("捕获到未知类型的线程panic payload"); } } } }
运行上述代码会输出捕获到线程panic,信息:panic in thread,完全可以还原出panic!宏传入的原始内容,确认线程是因执行panic!("panic in thread")触发故障。
内容的提问来源于stack exchange,提问作者calvin
相关产品推荐
相关产品推荐

