问题描述
在我的 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
板条箱本身引起的,那么在那里打开一个问题可能是个好主意。