【问题标题】:How to handle multiple errors in Rust-Diesel?如何处理 Rust-Diesel 中的多个错误?
【发布时间】:2021-01-09 12:48:54
【问题描述】:

我在我的 rust 项目中使用柴油和 postgres。

我现在正在努力解决的问题是,当我在表中插入时,可能会发生不同的错误,我想针对不同的错误类型采取不同的操作。

这些是错误: 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()。

【问题讨论】:

    标签: rust rust-diesel


    【解决方案1】:

    “错误类型”模式在某些情况下很有用,其中所有错误都基本相同或有很多公共信息/有效负载,并且除了错误类型之外没有个性。 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...]
    

    【讨论】:

      猜你喜欢
      • 2022-12-10
      • 2023-04-09
      • 2021-09-22
      • 2010-09-23
      • 2021-04-30
      • 2018-11-07
      • 2020-05-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多