Gestion des erreurs - Kit AWS SDK pour Rust

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

Il est important de comprendre comment et quand les erreurs de Kit 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 comment les gérer de manière appropriée.

Chaque opération renvoie un Result type dont le type d'erreur est défini sur SdkError<E, R = HttpResponse>. SdkErrorest une énumération avec plusieurs types possibles, appelés variants.

Erreurs de service

Le type d'erreur le plus courant est SdkError::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

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.

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.

  • Le <service>::operation::RequestIdExt trait ajoute la extended_request_id() méthode pour obtenir un ID de demande supplémentaire et étendu.

Erreur détaillée lors de l'impression avec DisplayErrorContext

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.

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

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

  4. Le service a renvoyé une erreur car la demande d'informations d'identification n'était pas autorisée correctement.

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.

Lorsque nous encapsulons l'erreur à afficher et que nous l'imprimonsDisplayErrorContext, 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 } } )