

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 處理適用於 Rust 的 AWS SDK 中的錯誤
<a name="error-handling"></a>

了解 適用於 Rust 的 AWS SDK 傳回錯誤的方式和時間對於使用 SDK 建置高品質應用程式至關重要。下列各節說明您可能會從 SDK 遇到的不同錯誤，以及如何適當處理這些錯誤。

每個操作都會傳回錯誤類型設為 的`Result`類型[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)。 `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>

 開發套件中的錯誤通常是失敗鏈的結果，例如：

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 
        } 
    }
)
```