错误处理 - AWS SDK for Rust

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

错误处理

了解 AWS SDK for Rust 返回错误的方式和时间对于使用 SDK 构建高质量的应用程序非常重要。以下各节描述了您在 SDK 中可能遇到的不同错误以及如何正确处理这些错误。

每个操作都会返回一个Result错误类型设置为SdkError<E, R = HttpResponse>SdkError是一个包含几种可能类型的枚举,称为变体。

服务错误

最常见的错误类型是SdkError::ServiceError。此错误表示来自的错误响应 AWS 服务。例如,如果您尝试从 Amazon S3 获取不存在的对象,Amazon S3 会返回错误响应。

当您遇到时SdkError::ServiceError,表示您的请求已成功发送到, AWS 服务 但无法处理。这可能是因为请求的参数中存在错误,或者是因为服务端的问题。

错误响应详细信息包含在错误变体中。以下示例显示了如何方便地获取底层ServiceError变体并处理不同的错误情况:

// Needed to access the '.code()' function on the error type: use aws_sdk_s3::error::ProvideErrorMetadata; let result = s3.get_object() .bucket("my-bucket") .key("my-key") .send() .await; match result { Ok(_output) => { /* Success. Do something with the output. */ } Err(err) => match err.into_service_error() { GetObjectError::InvalidObjectState(value) => { println!("invalid object state: {:?}", value); } GetObjectError::NoSuchKey(_) => { println!("object didn't exist"); } // err.code() returns the raw error code from the service and can be // used as a last resort for handling unmodeled service errors. err if err.code() == Some("SomeUnmodeledError") => {} err => return Err(err.into()) } };

错误元数据

每个服务错误都有额外的元数据,可以通过导入特定于服务的特征来访问这些元数据。

  • <service>::error::ProvideErrorMetadata该特征提供对任何可用的底层原始错误代码和从服务返回的错误消息的访问权限。

您还可以获得在排除服务错误时可能有用的信息:

  • <service>::operation::RequestId该特征添加了用于检索服务生成的唯一 AWS 请求 ID 的扩展方法。

  • <service>::operation::RequestIdExt该特征添加了获取额外扩展请求 ID extended_request_id() 的方法。

打印时出现的详细错误 DisplayErrorContext

SDK 中的错误通常是由一系列故障造成的,例如:

  1. 由于连接器返回错误,因此调度请求失败。

  2. 连接器返回错误,因为凭证提供程序返回了错误。

  3. 凭证提供程序返回了一个错误,因为它调用了一个服务,而该服务返回了一个错误。

  4. 该服务返回了一个错误,因为证书请求没有正确的授权。

默认情况下,显示此错误仅输出 “调度失败”。这缺少有助于解决错误的细节。适用于 Rust 的 SDK 提供了一个名为的简单错误报告器DisplayErrorContext

当我们封装要显示的错误并打印出来时,会DisplayErrorContext提供更详细的消息,类似于以下内容:

dispatch failure: other: Session token not found or invalid. DispatchFailure( DispatchFailure { source: ConnectorError { kind: Other(None), source: ProviderError( ProviderError { source: ProviderError( ProviderError { source: ServiceError( ServiceError { source: UnauthorizedException( UnauthorizedException { message: Some("Session token not found or invalid"), meta: ErrorMetadata { code: Some("UnauthorizedException"), message: Some("Session token not found or invalid"), extras: Some({"aws_request_id": "1b6d7476-f5ec-4a16-9890-7684ccee7d01"}) } } ), raw: Response { status: StatusCode(401), headers: Headers { headers: { "date": HeaderValue { _private: H0("Thu, 04 Jul 2024 07:41:21 GMT") }, "content-type": HeaderValue { _private: H0("application/json") }, "content-length": HeaderValue { _private: H0("114") }, "access-control-expose-headers": HeaderValue { _private: H0("RequestId") }, "access-control-expose-headers": HeaderValue { _private: H0("x-amzn-RequestId") }, "requestid": HeaderValue { _private: H0("1b6d7476-f5ec-4a16-9890-7684ccee7d01") }, "server": HeaderValue { _private: H0("AWS SSO") }, "x-amzn-requestid": HeaderValue { _private: H0("1b6d7476-f5ec-4a16-9890-7684ccee7d01") } } }, body: SdkBody { inner: Once( Some( b"{ \"message\":\"Session token not found or invalid\", \"__type\":\"com.amazonaws.switchboard.portal#UnauthorizedException\"}" ) ), retryable: true }, extensions: Extensions { extensions_02x: Extensions, extensions_1x: Extensions } } } ) } ) } ), connection: Unknown } } )