我想panic!
停止 Rust 中的一切,但如果我panic!
在 Iron 路由处理程序函数中它不会停止整个服务器。相反,它只显示恐慌消息。
这是“正常”的行为panic!
吗?
我没有发布我的实际代码,因为我认为它在这里没有用,但如果需要,我可以添加它。
我认为
panic!
停止 Rust 中的一切。
不完全:panic!
仅停止¹当前线程,对于单线程程序,这会停止整个程序。如果您生成另一个线程,父线程可以检测子线程在加入时是否恐慌。
Iron 使用许多线程来并行处理多个请求。显然它只是忽略了子线程中的恐慌......
¹ 作为 DK。而 Vladimir Matveev 在评论中提到,事情并没有那么简单。当恐慌被“抛出”时,可能会发生多种事情。默认情况下,应用程序开始展开(向下爬栈),直到到达堆栈的“末尾”或 a catch_unwind
。在前一种情况下,线程被杀死;在后者中,由用户决定发生什么。也可以配置您的构建,以便abort
在panic!
.
panic!
Rust 中的异常类似于其他语言中的异常,但有两个主要区别:
这使得将其用于带外信令变得很尴尬,因此将其用于“糟糕”的情况。
否则,它的行为通常以相同的方式运行:当前执行线程展开(适当地调用析构函数)直到发生以下 3 件事之一:
panic!
:进程立即中止catch_unwind
达到:处理程序决定做什么在此过程中,各种析构函数可能会毒化一些多线程数据结构,这可能会导致其他线程在尝试使用它们时出现恐慌,等等……然而,这是库的决定,不是由语言本身强制执行的。
注意:正如其他人所指出的,现在有另一种恐慌行为,即立即流产。它削减了一些代码,并且显然阻止了优雅的恢复。