Rust 从恐慌中恢复过来在另一个线程中

Rust 从恐慌中恢复过来在另一个线程中,rust,Rust,我知道在Rust中没有try/catch,并且你不能从当前恐慌的线程中抛出滚动保存 我知道你不应该创建和处理这样的错误。这只是举个例子 然而,我想知道从恐慌中恢复过来的最好方法是什么。这就是我现在拥有的: use std::thread; fn main() { println!("Hello, world!"); let h = thread::spawn(|| { thread::sleep_ms(1000); panic!("boom")

我知道在Rust中没有try/catch,并且你不能从当前恐慌的线程中抛出滚动保存

我知道你不应该创建和处理这样的错误。这只是举个例子

然而,我想知道从恐慌中恢复过来的最好方法是什么。这就是我现在拥有的:

use std::thread;

fn main() {
    println!("Hello, world!");

    let h = thread::spawn(|| {
        thread::sleep_ms(1000);
        panic!("boom");
    });

    let r = h.join();
    match r {
        Ok(r) => println!("All is well! {:?}", r),
        Err(e) => println!("Got an error! {:?}", e)
    }

    println!("Exiting main!");
}
有没有更好的方法来处理来自其他线程的错误?有没有办法捕捉恐慌的信息?这似乎只告诉我错误类型为
Any
。谢谢

抛开“您应该尽可能使用
Result
”,是的,这基本上就是您在Rust中陷入恐慌的原因。请记住,在Rust中,“recover”可能不是最好的表达方式。你并没有真正从锈病恐慌中恢复过来,你将它们隔离,然后检测它们。下一步恢复时没有
错误
:P

也就是说,有两件事需要添加到您的示例中。首先是如何获得恐慌信息。关键的观察是
任何
,为了被使用,必须明确地向下转换到它所包含的确切的具体类型。在这种情况下,由于紧急消息是一个
&'static str
,因此您需要向下转换到该消息

第二件事是夜间有一个新的API,名为
catch\u panic
,它允许您在不启动线程的情况下隔离一个panic。这就是说,它与生成新线程具有相同的限制:不能跨隔离边界传递非静态引用。注意,这是一个不稳定的加法;目前还不能保证稳定性,您需要一个夜间编译器来访问它

下面是一个例子,说明了这两个方面。你也可以

#![特征(捕捉恐慌)]
使用std::线程;
fn main(){
println!(“你好,世界!”);
设h=thread::spawn(| |{
线程:sleep_ms(500);
恐慌!(“繁荣”);
});
设r=h.join();
手柄(r);
让r=thread::捕捉恐慌{
线程:sleep_ms(500);
惊慌失措!(字符串::from(“又砰!”);
});
手柄(r);
println!(“正在退出main!”);
}
fn句柄(r:thread::Result){
火柴{
Ok(r)=>println!(“一切都很好!{:?}”,r),
错误(e)=>{

如果让一些(e)=e.downcast_ref::完美!关于错误格式为
&'static str
的部分正是我所需要的。谢谢!我有点惊讶,因为Rust是1.0,现在有更多的东西不稳定,但也很高兴在它们准备好之前没有出现。@jocull“1.0”并不意味着“我们完成了”,它只是意味着“好吧,我们现在要停止每隔几天就破坏一切。”如果你希望标准库“功能完整”,因为Rust是1.0,你会非常失望。:@DK:我宁愿说“如果你希望Rust在1.0之后停止进化,你会惊喜不已。”“:)请注意,如果死机也可能是非静态错误消息,您可能还需要检查是否存在
e.downcast\u ref::()