如何处理 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...]