5

我想panic!停止 Rust 中的一切,但如果我panic!在 Iron 路由处理程序函数中它不会停止整个服务器。相反,它只显示恐慌消息。

这是“正常”的行为panic!吗?

我没有发布我的实际代码,因为我认为它在这里没有用,但如果需要,我可以添加它。

4

2 回答 2

5

我认为panic!停止 Rust 中的一切。

不完全:panic!仅停止¹当前线程,对于单线程程序,这会停止整个程序。如果您生成另一个线程,父线程可以检测子线程在加入时是否恐慌。

Iron 使用许多线程来并行处理多个请求。显然它只是忽略了子线程中的恐慌......


¹ 作为 DK。而 Vladimir Matveev 在评论中提到,事情并没有那么简单。当恐慌被“抛出”时,可能会发生多种事情。默认情况下,应用程序开始展开(向下爬栈),直到到达堆栈的“末尾”或 a catch_unwind。在前一种情况下,线程被杀死;在后者中,由用户决定发生什么。也可以配置您的构建,以便abortpanic!.

于 2016-07-15T08:35:00.320 回答
2

panic!Rust 中的异常类似于其他语言中的异常,但有两个主要区别:

  • 您不能指定“类型”
  • 你不能指定“数据”

这使得将其用于带外信令变得很尴尬,因此将其用于“糟糕”的情况。

否则,它的行为通常以相同的方式运行:当前执行线程展开(适当地调用析构函数)直到发生以下 3 件事之一:

  • 析构函数panic!:进程立即中止
  • 到达栈底:进程立即中止
  • acatch_unwind达到:处理程序决定做什么

在此过程中,各种析构函数可能会毒化一些多线程数据结构,这可能会导致其他线程在尝试使用它们时出现恐慌,等等……然而,这是库的决定,不是由语言本身强制执行的。

注意:正如其他人所指出的,现在有另一种恐慌行为,即立即流产。它削减了一些代码,并且显然阻止了优雅的恢复。

于 2016-07-15T16:39:01.483 回答