我是 Rust 新手。我正在使用 sqlite crate 并且有这个:
connection.execute("CREATE TABLE my_table (foo, bar);").unwrap();
如果我运行这个并且
my_table
已经存在,这将“引发”一个错误,正如预期的那样:
called `Result::unwrap()` on an `Err` value: Error { code: Some(1), message: Some("table my_table already exists") }
我想“捕获”这个特定情况,然后忽略它,但在任何其他情况下继续“引发”错误。我一直在阅读 Rust Book 中的 Recoverable Errors with Result ,其中有一个处理
enum
错误的示例。然而,sqlite crate 中的错误是 structs
(doc)。尽管对于经验丰富的锈类动物来说,这可能是显而易见的,但我正在努力解决如何处理这个问题。我写了这段代码:
match connection.execute("CREATE TABLE my_table (foo, bar);") {
Ok(whatever) => "fine",
Err(error) => {
match error.code {
Some(1) => {
match error.message {
Some(ref msg) => {
if msg == "table my_table already exists" {
"ok"
} else {
panic!("Something happened {:?}", error);
}
}
_ => panic!("Something happened {:?}", error),
}
}
_ => panic!("Something happened {:?}", error),
}
}
};
这似乎有效,但我觉得这不是可行的方法,因为它的范围很广,而且我有很多重复的
panic!(...)
行。这是我应该处理错误的方式吗?有没有更惯用的方法?
正如@Ry-所说,正确的解决方法是使用
CREATE TABLE IF NOT EXISTS
。但要提高你的 Rust-fu:
match connection.execute("CREATE TABLE my_table (foo, bar);") {
Ok(_) => "fine",
Err(sqlite::Error {
code: Some(1),
message: Some(message),
}) if message == "table my_table already exists" => "ok",
Err(error) => panic!("Something happened: {error:?}"),
}