恐慌!无法停止Iron服务器

5

我认为在Rust中,panic!会停止所有的操作,但是如果我在Iron路由处理函数中使用panic!,它不会停止整个服务器。相反,它只会显示错误信息。

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

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

2个回答

5

我认为在Rust中,panic!会停止一切。

并非如此:对于单线程程序,panic!仅停止¹当前线程,从而停止整个程序。如果您生成另一个线程,则父线程可以检测到子线程是否发生了崩溃加入

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


正如DK和Vladimir Matveev在评论中提到的那样,这并不是那么简单。当恐慌被"抛出"时,可能会发生多种情况。默认情况下,应用程序开始展开(向下爬取堆栈),直到堆栈的"末尾"或达到catch_unwind。在前一种情况下,线程被杀死;在后一种情况下,由用户决定发生什么。您还可以配置您的构建,使panic!调用abort


“panic!”不一定会停止当前线程。默认情况下,它开始展开,这将继续要么终止线程要么展开到catch_unwind调用中。或者,它也可以中止整个进程。 - DK.
请注意,在最新的Rust版本中,可以启用panic时中止功能。 - Vladimir Matveev

2
在 Rust 中,panic! 类似于其他语言中的异常,但有两个主要区别:
  • 无法指定“类型”
  • 无法指定“数据”
这使得它在带外信号方面使用起来很麻烦,因此保留其用于“糟糕”情况。
否则,它以一般相同的方式运行:执行的当前线程展开(适当调用析构函数),直到发生以下三种情况之一:
  • 一个析构函数 panic!:进程立即中止
  • 堆栈底部被触及:进程立即中止
  • 达到catch_unwind:处理程序决定要做什么
在此过程中,各种析构函数可能会"毒化"某些多线程数据结构,当其他线程尝试使用它们时,可能会导致它们崩溃等。然而,这是库的决定,并不受语言本身的强制约束。
注意:正如其他人所指出的,现在有另一种 panic 的行为,即立即中止。它可以删除一些代码,并且显然防止了优雅恢复。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接