Всем привет, немного изучаю concurency и столкнулся с тем, что не могу вывести сообщение паники из потока:
Исходный код:
use std::thread;
use std::time::Duration;
fn main() {
let handle = thread::spawn(|| {
for i in 1..10 {
println!("hi number {} from the spawned thread!", i);
thread::sleep(Duration::from_millis(1));
}
panic!("failed to spawn");
});
for i in 1..5 {
println!("hi number {} from the main thread!", i);
thread::sleep(Duration::from_millis(1));
}
println!("Wait");
while !handle.is_finished() {
thread::sleep(Duration::from_secs(1));
}
println!("Finish");
match handle.join() {
Ok(res) => println!("{:?}", res),
Err(err) => {
println!("{:?}", err);
}
}
}
Вывод
hi number 1 from the main thread!
hi number 1 from the spawned thread!
hi number 2 from the main thread!
hi number 2 from the spawned thread!
hi number 3 from the main thread!
hi number 3 from the spawned thread!
hi number 4 from the main thread!
hi number 4 from the spawned thread!
Wait
hi number 5 from the spawned thread!
hi number 6 from the spawned thread!
hi number 7 from the spawned thread!
hi number 8 from the spawned thread!
hi number 9 from the spawned thread!
thread '<unnamed>' panicked at 'failed to spawn', src/main.rs:71:9
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
Finish
Any { .. }
71:9 - соответствует окончанию вызова thread::spawn.
match handle.join вернет Err(err: Box)
Попробовал преобразовать Box в строку как в примере:
https://doc.rust-lang.org/std/any/trait.Any.html
fn print_if_string(value: Box<dyn Any>) {
if let Ok(string) = value.downcast::<String>() {
println!("String ({}): {}", string.len(), string);
}
}
Но это не строка.
Есть у кого идеи - как можно определить тип чтобы преобразовать к строке и вывести причину ошибки?