当请求恐慌时,如何让我的 Rocket 应用程序响应错误?

问题描述

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

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

解决方法

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

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

,

您总是可以像这样使用 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 板条箱本身引起的,那么在那里打开一个问题可能是个好主意。