

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.

# Manejo de errores en el AWS SDK de Rust
<a name="error-handling"></a>

Entender cómo y cuándo se AWS SDK para Rust generan 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 [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` es una enumeración con varios tipos posibles, denominados variantes.

## Errores de servicio
<a name="serviceErrors"></a>

El tipo de error más común es [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). Este error representa una respuesta de error de un Servicio de AWS. Por ejemplo, si intenta obtener un objeto de Amazon S3 que no existe, Amazon S3 devuelve una respuesta de error.

Si encuentras un error`SdkError::ServiceError`, significa que tu solicitud se envió correctamente Servicio de AWS , pero no se pudo procesar. 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
<a name="errorMetadata"></a>

 Cada error de servicio tiene metadatos adicionales a los que se puede acceder importando características específicas del servicio. 
+ La característica `{{<service>}}::error::ProvideErrorMetadata` proporciona acceso a cualquier código de error subyacente sin procesar disponible y a cualquier mensaje de error devuelto por el servicio.
  + En Amazon S3, esta característica es [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). 

También puede obtener información que podría ser útil para solucionar errores de servicio:
+ La `{{<service>}}::operation::RequestId` característica agrega métodos de extensión para recuperar el ID de AWS solicitud único que generó el servicio. 
  + Para Amazon S3, esta característica es [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).
+ La característica `{{<service>}}::operation::RequestIdExt` agrega el método `extended_request_id()` para obtener un ID de solicitud extendida adicional. 
  + Solo se admite en algunos servicios.
  +  En Amazon S3, este indicador es [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).

## Impresión de errores detallados con `DisplayErrorContext`
<a name="displayErrorContext"></a>

 Los errores del SDK suelen ser el resultado de una cadena de errores, como:

1. No se pudo enviar una solicitud porque el conector devolvió un error.

1. El conector devolvió un error porque el proveedor de credenciales también lo hizo. 

1. El proveedor de credenciales devolvió un error porque llamó a un servicio y este devolvió un error.

1. El servicio devolvió un error porque la solicitud de credenciales no tenía la autorización correcta.

De forma predeterminada, este error solo muestra “dispatch failure”. No proporciona detalles que ayuden a solucionar el error. El SDK para Rust proporciona un simple informante de errores llamado `DisplayErrorContext`.
+  La estructura `{{<service>}}::error::DisplayErrorContext` agrega funcionalidad para mostrar el contexto completo del error.
  + En Amazon S3, esta estructura es [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).

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