如何使用适用于 DynamoDb 的 AWS Rust 开发工具包编写惯用的 Rust 错误处理?

Posted

技术标签:

【中文标题】如何使用适用于 DynamoDb 的 AWS Rust 开发工具包编写惯用的 Rust 错误处理?【英文标题】:How to write idiomatic Rust error handling using AWS Rust SDK for DynamoDb? 【发布时间】: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::ResponseErrorraw, err => eprintln!("ResponseError:\n:?\n\n:?", raw, err),
                SdkError::ServiceErrorraw: _, err => 
                    match err.kind 
                        dynamodb::error::PutItemErrorKind::ConditionalCheckFailedException(ccfe) =>
                             eprintln!("ConditionalCheckFailedException: :?", ccfe),
                        _ => eprintln!("Don't know what kind.")

                    
                ,
            ;
            process::exit(1);
        
    ;

  ...  

谢谢!!

【问题讨论】:

【参考方案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
    // ...

【讨论】:

以上是关于如何使用适用于 DynamoDb 的 AWS Rust 开发工具包编写惯用的 Rust 错误处理?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 AWS DynamoDB 表导出到 S3 存储桶?

AWS SQS FIFO或AWS DynamoDB用于处理大量消息

AWS Data Pipeline DynamoDB 到 S3 到 Redshift,包括 JsonPaths

DynamoDB - JAVA - 具有低级API的BatchWrite

如何使用 AWS Lambda 按名称查询 dynamoDB 表

DynamoDB 如何使用 AWS KMS