如何处理Rust-Diesel中的多个错误?

问题描述

我在防锈项目中使用柴油和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...]