【问题标题】:How to write idiomatic Rust error handling using AWS Rust SDK for DynamoDb?如何使用适用于 DynamoDb 的 AWS Rust 开发工具包编写惯用的 Rust 错误处理?
【发布时间】:2021-10-10 18:35:35
【问题描述】:

我是 Rust 新手,具有 Java、Groovy 和 C 方面的背景。在我的 Rust 旅程中,我什至不知道如何在 Google 中表达这个问题。

我的问题是,有人可以给我一个惯用的 Rust 示例来替换下面我丑陋的代码 sn-p 吗?真难闻。

目标是在将新行插入 AWS DynamoDb 时检测到 ConditionalCheckFailedException,然后相应地处理错误 - 而不是将其冒泡到最终调用者。

我下面的代码大致基于此处找到的示例:https://github.com/awslabs/aws-sdk-rust/blob/c0905d9c991bb38a9738f1ffcb74e200772afc12/sdk/examples/dynamo-add-item/src/main.rs#L128

use dynamodb::model::AttributeValue;
use dynamodb::Client;
use aws_hyper::SdkError;

  ...

    match request.send().await {
        Ok(_) => {
            println!("Added new row.");
            println!("");
        }
        Err(e) => {
            match e {
                SdkError::ConstructionFailure(ce) => eprintln!("ConstructionFailure:\n{:?}", ce),
                SdkError::DispatchFailure(df) => eprintln!("DispatchFailure:\n{:?}", df),
                SdkError::ResponseError{raw, err} => eprintln!("ResponseError:\n{:?}\n\n{:?}", raw, err),
                SdkError::ServiceError{raw: _, err} => {
                    match err.kind {
                        dynamodb::error::PutItemErrorKind::ConditionalCheckFailedException(ccfe) =>
                             eprintln!("ConditionalCheckFailedException: {:?}", ccfe),
                        _ => eprintln!("Don't know what kind.")

                    }
                },
            };
            process::exit(1);
        }
    };

  ...  

谢谢!!

【问题讨论】:

    标签: amazon-web-services rust amazon-dynamodb


    【解决方案1】:

    所有 AWS rust sdk crate 直接通过 Error 枚举为每个服务导出所有可能的错误类型。例如,aws_sdk_dynamodbcrate exports all the errors 通过枚举 aws_sdk_dynamodb::Error 用于 DynamoDB 服务。

    您应该能够将上面的代码 sn-p 简化如下:

    use aws_sdk_dynamodb::{
        error::PutItemErrorKind,
        model::{AttributeValue, Select},
        Error as DynamoDbError,
    };
    
    // send request and map the error to the `aws_sdk_dynamodb::Error` enum
    let response = request.send().await.map_err(|e| DynamoDbError::from(e));
    
    if let Err(PutItemErrorKind::ConditionalCheckFailedException(err)) = response {
        println!("ConditionalCheckFailedException: {}", err);
        // do error handling
        // ...
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-28
      • 1970-01-01
      相关资源
      最近更新 更多