如何处理 Rust 中的结构错误?

问题描述 投票:0回答:1

我是 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!(...)
行。这是我应该处理错误的方式吗?有没有更惯用的方法?

sqlite rust error-handling
1个回答
2
投票

正如@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:?}"),
}
© www.soinside.com 2019 - 2024. All rights reserved.