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
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.OperationErrorOperationError 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
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
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.ResponseErrorServiceRequestID() 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.ResponseErrorServiceRequestID() 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 }