问题描述
我在防锈项目中使用柴油和postgres。
我现在遇到的问题是,当我将insert_into表插入表中时,可能会发生不同的错误,并且我想针对不同的错误类型采取不同的操作。
这些是错误: 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
),因为DB引擎通常只提供错误标识符/代码和一堆元数据,但是哪个错误导致哪些元数据通常是未记录的并且随时间变化。
但是,在最顶层,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...]