【问题标题】:How can I make my Rocket app respond with an error when a request panics?当请求恐慌时,如何让我的 Rocket 应用程序响应错误?
【发布时间】:2021-09-07 15:04:05
【问题描述】:

在我的 Rocket Web 应用程序中,我有一个从 MySQL 数据库读取数据的服务。在某个时候,NULL 值出现在 VARCHAR 字段中 - 这是我的代码没有预料到的,因此 tx.query_map() 方法开始恐慌。我不喜欢 mysql 在这种情况下出现恐慌的事实。但这只是表明无论我们如何编写我们的代码,都会发生恐慌 - 我们永远无法知道外部库何时会恐慌而不是返回错误值。

所以我的问题是,为什么 Rocket 在发生恐慌时会在响应中返回带有空 JSON 数组 ([]) 的 200 OK 状态代码,而不是返回诸如 500 之类的错误状态代码?我应该在我的设置中做一些明确的事情吗?如果是,那是什么?

【问题讨论】:

  • 你能发一个minimal, reproducible example吗?因为默认情况下,Rocket v0.5-rc 完全符合您的要求:如果处理程序发生恐慌,它会返回 500 状态代码。

标签: rust rust-rocket


【解决方案1】:

您总是可以像这样使用catch_unwind(来自文档的示例):

use std::panic;

let result = panic::catch_unwind(|| {
    println!("hello!");
});
assert!(result.is_ok());

let result = panic::catch_unwind(|| {
    panic!("oh no!");
});
assert!(result.is_err());

但我会尽可能避免这种情况,恐慌通常不会被您的应用程序“捕获”和处理。如果恐慌是由 mysql 板条箱本身引起的,那么在那里打开一个问题可能是个好主意。

【讨论】:

  • 我不确定如何使用该代码来响应用户的 request 错误?至于您的建议,解决具体问题是另一回事。关键是应用程序应该处理恐慌,因为它们不可能一直避免。
  • @at54321 如果你真的需要处理恐慌,然后使用上面显示的函数来捕捉恐慌并将其转换为错误,然后你可以通过记录它来正常处理它,返回相应的HTTP 状态代码等。重复一遍,在大多数情况下,恐慌并不意味着你会发现它。您显然应该采取措施确保您的应用程序始终可用,并且可以处理意外问题,例如崩溃,这些问题总是可能发生。
  • 另外,正如对您问题的评论所指出的那样,火箭似乎已经为您处理了恐慌。
【解决方案2】:

我错了。 Rocket 确实回复了500 Internal Server Error。我得到那个奇怪的200 OK 和空 JSON 数组响应正文的原因是因为请求通过一个与 Rocket 和 Rust 无关的代理 - 我完全忘记了,这就是为什么我报告我所看到的在 Chrome 的网络标签中。显然代理没有正确处理这些情况。

顺便说一句,我使用的是 Rocket 0.4.10

【讨论】:

    猜你喜欢
    • 2017-05-07
    • 2020-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-22
    • 2016-02-27
    • 1970-01-01
    • 2022-01-25
    相关资源
    最近更新 更多