

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# AWS SDK for Rust でのエラーの処理
<a name="error-handling"></a>

SDK を使用して高品質のアプリケーションを構築するには、 がエラーをいつどのように AWS SDK for Rust 返すかを理解することが重要です。以下のセクションでは、SDK で発生する可能性のあるさまざまなエラーと、その適切な処理方法について説明します。

すべてのオペレーションは、エラータイプが [https://docs.rs/aws-smithy-runtime-api/latest/aws_smithy_runtime_api/client/result/enum.SdkError.html](https://docs.rs/aws-smithy-runtime-api/latest/aws_smithy_runtime_api/client/result/enum.SdkError.html) に設定された `Result` タイプを返します。`SdkError` は、バリアントと呼ばれるいくつかの可能なタイプを持つ列挙型です。

## サービスエラー
<a name="serviceErrors"></a>

最も一般的なエラーのタイプは [https://docs.rs/aws-smithy-runtime-api/latest/aws_smithy_runtime_api/client/result/enum.SdkError.html#variant.ServiceError](https://docs.rs/aws-smithy-runtime-api/latest/aws_smithy_runtime_api/client/result/enum.SdkError.html#variant.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())
    }
};
```

## エラーメタデータ
<a name="errorMetadata"></a>

 すべてのサービスエラーには、サービス固有のトレイトをインポートすることによりアクセスできる追加のメタデータがあります。
+ `{{<service>}}::error::ProvideErrorMetadata` トレイトは、サービスから返される利用可能な基盤となる生のエラーコードとエラーメッセージへのアクセスを提供します。
  + Amazon S3 の場合、このトレイトは [https://docs.rs/aws-sdk-s3/latest/aws_sdk_s3/error/trait.ProvideErrorMetadata.html](https://docs.rs/aws-sdk-s3/latest/aws_sdk_s3/error/trait.ProvideErrorMetadata.html) です。

以下のように、サービスエラーのトラブルシューティングに役立つ情報を取得することもできます。
+ `{{<service>}}::operation::RequestId` 特性は、サービスによって生成された一意の AWS リクエスト ID を取得するための拡張メソッドを追加します。
  + Amazon S3 の場合、このトレイトは [https://docs.rs/aws-sdk-s3/latest/aws_sdk_s3/operation/trait.RequestId.html](https://docs.rs/aws-sdk-s3/latest/aws_sdk_s3/operation/trait.RequestId.html) です。
+ `{{<service>}}::operation::RequestIdExt` トレイトによって `extended_request_id()` メソッドを追加して、追加の拡張リクエスト ID を取得します。
  + 一部のサービスでのみサポートされています。
  +  Amazon S3 の場合、このトレイトは [https://docs.rs/aws-sdk-s3/latest/aws_sdk_s3/operation/trait.RequestIdExt.html](https://docs.rs/aws-sdk-s3/latest/aws_sdk_s3/operation/trait.RequestIdExt.html) です。

## `DisplayErrorContext` による詳細なエラー出力
<a name="displayErrorContext"></a>

 SDK におけるエラーは、通常次のような一連の障害の結果として発生します。

1. コネクタによってエラーを返したため、リクエストのディスパッチに失敗しました。

1. 認証情報プロバイダーによってエラーを返したため、コネクタはエラーを返しました。

1. 認証情報プロバイダーによってサービスを呼び出し、そのサービスがエラーを返したため、エラーが返されました。

1. 認証情報リクエストに正しい認可がないため、サービスからエラーが返されました。

デフォルトでは、このエラーの表示は「ディスパッチ失敗」のみを出力します。これには、エラーのトラブルシューティングに役立つ詳細情報が不足しています。SDK for Rust には、`DisplayErrorContext` というシンプルなエラーレポーターが用意されています。
+  `{{<service>}}::error::DisplayErrorContext` 構造体は、完全なエラーコンテキストを出力する機能を追加します。
  + Amazon S3 の場合、この構造体は [https://docs.rs/aws-sdk-s3/latest/aws_sdk_s3/error/struct.DisplayErrorContext.html](https://docs.rs/aws-sdk-s3/latest/aws_sdk_s3/error/struct.DisplayErrorContext.html) です。

エラーを表示して出力するようにまとめると、`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 
        } 
    }
)
```