如何使用适用于 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_dynamodb
crate 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 SQS FIFO或AWS DynamoDB用于处理大量消息
AWS Data Pipeline DynamoDB 到 S3 到 Redshift,包括 JsonPaths
DynamoDB - JAVA - 具有低级API的BatchWrite