Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.
Gestión de errores en AWS SDK para Rust
Saber cómo y cuándo el AWS SDK para Rust produce errores es importante para crear aplicaciones de alta calidad con el SDK. En las siguientes secciones se describen los distintos errores que se pueden producir en el SDK y cómo gestionarlos adecuadamente.
Cada operación devuelve un tipo Result con el tipo de error establecido en SdkError<E, R = HttpResponse>SdkError es una enumeración con varios tipos posibles, denominados variantes.
Errores de servicio
El tipo de error más común es SdkError::ServiceError
Cuando encuentre un SdkError::ServiceError, sabrá que la solicitud se ha enviado correctamente al Servicio de AWS, pero que no se ha podido procesar correctamente. Esto puede ser debido a errores en los parámetros de la solicitud o a problemas en el servicio.
Se incluyen detalles sobre la respuesta del error en la variante de error. El siguiente ejemplo muestra cómo acceder fácilmente a la variante ServiceError subyacente y gestionar diferentes casos de error:
// 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()) } };
Metadatos de error
Cada error de servicio tiene metadatos adicionales a los que se puede acceder importando características específicas del servicio.
-
La característica
proporciona acceso a cualquier código de error subyacente sin procesar disponible y a cualquier mensaje de error devuelto por el servicio.<service>::error::ProvideErrorMetadata-
En Amazon S3, esta característica es
aws_sdk_s3::error::ProvideErrorMetadata.
-
También puede obtener información que podría ser útil para solucionar errores de servicio:
-
La característica
agrega métodos de extensión para recuperar el ID de solicitud único de AWS que generó el servicio.<service>::operation::RequestId-
Para Amazon S3, esta característica es
aws_sdk_s3::operation::RequestId.
-
-
La característica
agreda el método<service>::operation::RequestIdExtextended_request_id()para obtener un ID de solicitud extendida adicional.-
Solo se admite en algunos servicios.
-
En Amazon S3, este indicador es
aws_sdk_s3::operation::RequestIdExt.
-
Impresión de errores detallados con DisplayErrorContext
Los errores del SDK suelen ser el resultado de una cadena de errores, como:
-
No se pudo enviar una solicitud porque el conector devolvió un error.
-
El conector devolvió un error porque el proveedor de credenciales también lo hizo.
-
El proveedor de credenciales devolvió un error porque llamó a un servicio y este devolvió un error.
-
El servicio devolvió un error porque la solicitud de credenciales no tenía la autorización correcta.
De forma predeterminada, este error solo muestra «error de envío». No proporciona detalles que ayuden a solucionar el error. El SDK para Rust proporciona un simple informante de errores llamado DisplayErrorContext.
-
La estructura
agrega funcionalidad para mostrar el contexto completo del error.<service>::error::DisplayErrorContext-
En Amazon S3, esta estructura es
aws_sdk_s3::error::DisplayErrorContext.
-
Cuando encapsulamos el error que se va a mostrar y lo imprimimos, DisplayErrorContext proporciona un mensaje mucho más detallado similar al siguiente:
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 } } )