首页 文章

恐慌!不会停止Iron服务器

提问于
浏览
5

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

panic! 的"normal"行为?

我没有发布我的实际代码,因为我觉得它不适用于此,但我可以根据需要添加它 .

2 回答

  • 2

    我以为恐慌!在Rust中停止一切 .

    不完全: panic! 只停止当前线程,单线程程序停止整个程序 . 如果你产生另一个线程,父线程可以检测子线程是否恐慌on joining .

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


    ¹作为DK . 弗拉基米尔·马特维耶夫在评论中提到,并不是那么简单 . 当恐慌发生时,可能会发生多种事情 . 默认情况下,应用程序开始展开(爬下堆栈),直到堆栈的"the end"或达到 catch_unwind . 在前一种情况下,线程被杀死;在后者中's up to the user to decide what happens. It'也是possible to configure你的构建,以便在 panic! 上调用 abort .

  • 5

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

    • 你不能指定"type"

    • 你不能指定"data"

    这使得将其用于带外信令变得尴尬,因此将其用于“哎呀”情况 .

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

    • 析构函数 panic! :进程立即中止

    • 到达堆栈的底部:进程立即中止
      到达

    • a catch_unwind :处理程序决定要做什么

    在此过程中,各种析构函数可能会破坏某些多线程数据结构,这可能会导致其他线程在尝试使用它们时出现混乱等等......然而这是一个库决策并且不是由语言本身强制执行的 .

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

相关问题