

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

# Gestion des erreurs dans le AWS SDK pour Rust
<a name="error-handling"></a>

Il est important de comprendre comment et quand les erreurs de AWS SDK pour Rust retour sont renvoyées pour créer des applications de haute qualité à l'aide du SDK. Les sections suivantes décrivent les différentes erreurs que vous pouvez rencontrer dans le SDK et la manière de les gérer de manière appropriée. 

Chaque opération renvoie un `Result` type dont le type d'erreur est défini sur [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`est une énumération avec plusieurs types possibles, appelés variants.

## Erreurs de service
<a name="serviceErrors"></a>

Le type d'erreur le plus courant est [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). Cette erreur représente une réponse d'erreur d'un Service AWS. Par exemple, si vous essayez d'obtenir un objet d'Amazon S3 qui n'existe pas, Amazon S3 renvoie une réponse d'erreur.

Lorsque vous rencontrez un, `SdkError::ServiceError` cela signifie que votre demande a été envoyée avec succès Service AWS mais n'a pas pu être traitée. La raison peut en être une erreur des paramètres de la demande ou un problème côté service. 

 Les détails de la réponse d'erreur sont inclus dans la variante d'erreur. L'exemple suivant montre comment accéder facilement à la `ServiceError` variante sous-jacente et gérer les différents cas d'erreur :

```
// 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())
    }
};
```

## Métadonnées d'erreur
<a name="errorMetadata"></a>

 Chaque erreur de service comporte des métadonnées supplémentaires accessibles en important des traits spécifiques au service. 
+ Le `<service>::error::ProvideErrorMetadata` trait donne accès à tout code d'erreur brut sous-jacent disponible et à tout message d'erreur renvoyé par le service.
  + Pour Amazon S3, cette caractéristique est [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). 

Vous pouvez également obtenir des informations qui peuvent être utiles pour résoudre les erreurs de service :
+ Le `<service>::operation::RequestId` trait ajoute des méthodes d'extension pour récupérer l'ID de AWS demande unique généré par le service. 
  + Pour Amazon S3, cette caractéristique est [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).
+ Le `<service>::operation::RequestIdExt` trait ajoute la `extended_request_id()` méthode pour obtenir un ID de demande supplémentaire et étendu. 
  + Pris en charge uniquement par certains services.
  +  Pour Amazon S3, cette caractéristique est [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).

## Erreur détaillée lors de l'impression avec `DisplayErrorContext`
<a name="displayErrorContext"></a>

 Les erreurs du SDK sont généralement le résultat d'une série de défaillances telles que :

1. L'envoi d'une demande a échoué car le connecteur a renvoyé une erreur.

1. Le connecteur a renvoyé une erreur car le fournisseur d'informations d'identification a renvoyé une erreur. 

1. Le fournisseur d'informations d'identification a renvoyé une erreur car il a appelé un service et ce service a renvoyé une erreur.

1. Le service a renvoyé une erreur car la demande d'informations d'identification ne bénéficiait pas de l'autorisation appropriée.

Par défaut, l'affichage de cette erreur indique uniquement un « échec d'expédition ». Cela ne contient pas de détails permettant de résoudre l'erreur. Le SDK pour Rust fournit un simple rapporteur d'erreurs appelé`DisplayErrorContext`.
+  La `<service>::error::DisplayErrorContext` structure ajoute des fonctionnalités pour afficher le contexte d'erreur complet.
  + Pour Amazon S3, cette structure est [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).

Lorsque nous encapsulons l'erreur à afficher et que nous l'imprimons`DisplayErrorContext`, nous obtenons un message beaucoup plus détaillé similaire au suivant :

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