如何处理 Rust-Diesel 中的多个错误?
How to handle multiple errors in Rust-Diesel?
我在 rust 项目中使用 diesel 和 postgres。
我现在正在努力解决的问题是当我 insert_into table 时可能会发生不同的错误,我想针对不同的错误类型采取不同的操作。
这些是错误:
Diesel DatabaseErrorKind
我想做这样的事情 (source):
use std::fs::File;
use std::io::ErrorKind;
fn main() {
let f = File::open("hello.txt");
let f = match f {
Ok(file) => file,
Err(error) => match error.kind() {
ErrorKind::NotFound => match File::create("hello.txt") {
Ok(fc) => fc,
Err(e) => panic!("Problem creating the file: {:?}", e),
},
other_error => {
panic!("Problem opening the file: {:?}", other_error)
}
},
};
}
问题是柴油错误没有 error.kind()。
“错误种类”模式在某些情况下很有用,在这些情况下,所有错误基本相同或具有很多共同信息/有效载荷,并且除了错误种类之外没有任何个性。 Diesel 将这种模式用于数据库错误(因此 DatabaseErrorKind
),因为数据库引擎通常只提供一个错误标识符/代码和一堆元数据,但是哪个错误得到哪个元数据通常是未记录的并且会随时间变化。
然而,在顶层,Diesel 更准确地知道错误是什么以及每个错误可能表示什么,因此它使用 a direct error enun。
所以你只需...匹配那个而不是匹配错误类型:
match r {
Ok(r) => ...,
Err(e) => match e {
NotFound => ...,
InvalidCString(_) => ...,
[etc...]
也应该可以使匹配变平,例如
match r {
Ok(r) => ...,
Err(NotFound) => ...,
Err(InvalidCString(_)) => ...,
[etc...]
我在 rust 项目中使用 diesel 和 postgres。
我现在正在努力解决的问题是当我 insert_into table 时可能会发生不同的错误,我想针对不同的错误类型采取不同的操作。
这些是错误: Diesel DatabaseErrorKind
我想做这样的事情 (source):
use std::fs::File;
use std::io::ErrorKind;
fn main() {
let f = File::open("hello.txt");
let f = match f {
Ok(file) => file,
Err(error) => match error.kind() {
ErrorKind::NotFound => match File::create("hello.txt") {
Ok(fc) => fc,
Err(e) => panic!("Problem creating the file: {:?}", e),
},
other_error => {
panic!("Problem opening the file: {:?}", other_error)
}
},
};
}
问题是柴油错误没有 error.kind()。
“错误种类”模式在某些情况下很有用,在这些情况下,所有错误基本相同或具有很多共同信息/有效载荷,并且除了错误种类之外没有任何个性。 Diesel 将这种模式用于数据库错误(因此 DatabaseErrorKind
),因为数据库引擎通常只提供一个错误标识符/代码和一堆元数据,但是哪个错误得到哪个元数据通常是未记录的并且会随时间变化。
然而,在顶层,Diesel 更准确地知道错误是什么以及每个错误可能表示什么,因此它使用 a direct error enun。
所以你只需...匹配那个而不是匹配错误类型:
match r {
Ok(r) => ...,
Err(e) => match e {
NotFound => ...,
InvalidCString(_) => ...,
[etc...]
也应该可以使匹配变平,例如
match r {
Ok(r) => ...,
Err(NotFound) => ...,
Err(InvalidCString(_)) => ...,
[etc...]