我是Rust的新手,有Java、Groovy和c的背景。在我的Rust之旅中,我甚至不知道如何在Google上表达这个问题。
我的问题是,谁能给我一个习惯Rust的例子来代替我下面丑陋的代码片段?真难闻。
目标是在向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{:?}nn{:?}", 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);
}
};
...
谢谢! !
所有AWS rust sdk crate直接通过Error
enum导出每个服务的所有可能的错误类型。例如,aws_sdk_dynamodb
crate通过enumaws_sdk_dynamodb::Error
导出DynamoDB服务的所有错误。
你应该能够简化上面的代码片段如下:
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
// ...
}