Gestión de errores en AWS SDK para Go V2 - AWS SDK para Go  v2

Gestión de errores en AWS SDK para Go V2

AWS SDK para Go devuelve errores que cumplen con el tipo de interfaz error de Go. Puede usar el método Error() para obtener una cadena con formato del mensaje de error del SDK sin ningún tratamiento especial. Los errores que devuelve el SDK pueden implementar un método Unwrap. El SDK utiliza el método Unwrap para proporcionar información contextual adicional sobre los errores y, al mismo tiempo, proporcionar acceso al error o la cadena de errores subyacentes. El método Unwrap debe usarse con Errors.as para gestionar la desencapsulación de las cadenas de error.

Es importante que la aplicación compruebe si se ha producido un error después de invocar una función o un método que pueda devolver un tipo de interfaz error. La forma más básica de gestión de errores es similar al ejemplo siguiente:

if err != nil { // Handle error return }

Registro de errores

Tradicionalmente, la forma más sencilla de gestionar errores consiste en registrar o imprimir el mensaje de error antes de volver a la aplicación o salir de ella.

import "log" // ... if err != nil { log.Printf("error: %s", err.Error()) return }

Errores del cliente de servicio

El SDK encapsula todos los errores devueltos por clientes de servicio con el tipo de error smithy.OperationError. OperationError proporciona información contextual sobre el nombre del servicio y la operación asociada a un error subyacente. Esta información puede resultar útil para las aplicaciones que realizan lotes de operaciones en uno o varios servicios, con un mecanismo de gestión de errores centralizado. Su aplicación puede utilizar errors.As para acceder a estos metadatos OperationError.

import "log" import "github.com/aws/smithy-go" // ... if err != nil { var oe *smithy.OperationError if errors.As(err, &oe) { log.Printf("failed to call service: %s, operation: %s, error: %v", oe.Service(), oe.Operation(), oe.Unwrap()) } return }

Respuestas de error de la API

Las operaciones de servicio pueden devolver tipos de errores modelados para indicar errores específicos. Estos tipos modelados se pueden utilizar con errors.As para desencapsular y determinar si el fallo de la operación se ha debido a un error específico. Por ejemplo, el uso de CreateBucket de Amazon S3 puede devolver un error BucketAlreadyExists si existe un bucket con el mismo nombre.

Por ejemplo, para comprobar si un error fue del tipo BucketAlreadyExists:

import "log" import "github.com/aws/aws-sdk-go-v2/service/s3/types" // ... if err != nil { var bne *types.BucketAlreadyExists if errors.As(err, &bne) { log.Println("error:", bne) } return }

Todos los errores de respuesta de la API de servicio implementan el tipo de interfaz smithy.APIError. Esta interfaz se puede utilizar para gestionar tanto las respuestas de error de servicio modeladas como las no modeladas. Este tipo proporciona acceso al código y al mensaje de error que devuelve el servicio. Además, este tipo indica si el error fue responsabilidad del cliente o del servidor, en caso de conocerse.

import "log" import "github.com/aws/smithy-go" // ... if err != nil { var ae smithy.APIError if errors.As(err, &ae) { log.Printf("code: %s, message: %s, fault: %s", ae.ErrorCode(), ae.ErrorMessage(), ae.ErrorFault().String()) } return }

Recuperación de identificadores de solicitud

Al trabajar con AWS Support, es posible que se le pida que proporcione el identificador de la solicitud cuyos errores intenta solucionar. Puede usar http.ResponseError y el método ServiceRequestID() para recuperar el identificador de solicitud asociado a la respuesta de error.

import "log" import awshttp "github.com/aws/aws-sdk-go-v2/aws/transport/http" // ... if err != nil { var re *awshttp.ResponseError if errors.As(err, &re) { log.Printf("requestID: %s, error: %v", re.ServiceRequestID(), re.Unwrap()); } return }

Identificadores de solicitud de Amazon S3

Las solicitudes de Amazon S3 contienen identificadores adicionales que se pueden utilizar para ayudar a AWS Support a solucionar los errores de su solicitud. Puede usar s3.ResponseError y llamar a ServiceRequestID() y ServiceHostID() para recuperar el ID de solicitud y el de host.

import "log" import "github.com/aws/aws-sdk-go-v2/service/s3" // ... if err != nil { var re s3.ResponseError if errors.As(err, &re) { log.Printf("requestID: %s, hostID: %s request failure", re.ServiceRequestID(), re.ServiceHostID()); } return }