恐慌!不会停止 Iron 服务器

panic! does not stop an Iron server

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

panic!的"normal"行为吗?

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

I thought panic! stops everything in Rust.

不完全是:panic! 仅停止¹ 当前 线程,对于单线程程序,它会停止整个程序。如果你生成另一个线程,父线程可以检测子线程是否崩溃 on joining.

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


¹ 作为 DK。和评论中提到的 Vladimir Matveev,这并不 简单。当恐慌 "thrown" 时,可能会发生多种情况。默认情况下,应用程序开始展开(向下攀登堆栈),直到到达堆栈的 "the end" 或到达 catch_unwind。在前一种情况下,线程被杀死;在后者中,由用户决定会发生什么。这也是 possible to configure 您的构建,因此 abortpanic! 上被调用。

Rust 中的

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

  • 您不能指定 "type"
  • 你不能指定"data"

这使得将其用于带外信号变得很尴尬,因此将其用于 "Oops" 情况。

否则,它的行为通常大致相同:当前执行线程展开(适当地调用析构函数)直到发生以下三种情况之一:

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

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

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