Gerenciamento de erros no AWS SDK para Go V2
O AWS SDK para Go retorna erros que satisfazem o tipo de interface de error do Go. Use o método Error() para obter uma string formatada da mensagem de erro do SDK sem nenhum tratamento especial. Os erros retornados pelo SDK podem implementar um método Unwrap. O método Unwrap é usado pelo SDK para fornecer informações contextuais adicionais sobre erros, ao mesmo tempo que concede acesso ao erro subjacente ou à cadeia de erros. O método Unwrap deve ser usado com errors.As
É importante que a aplicação verifique se ocorreu um erro após invocar uma função ou um método que possa retornar um tipo de interface de error. A forma mais básica de gerenciamento de erros se parece com este exemplo:
if err != nil { // Handle error return }
Registro em log de erros
Tradicionalmente, a forma mais simples de gerenciamento de erros é registrar em log ou imprimir a mensagem de erro antes de retornar ou sair da aplicação.
import "log" // ... if err != nil { log.Printf("error: %s", err.Error()) return }
Erros do cliente de serviço
O SDK encapsula todos os erros retornados pelos clientes do serviço com o tipo de erro smithy.OperationErrorOperationError fornece informações contextuais sobre o nome do serviço e a operação associada a um erro subjacente. Essas informações podem ser úteis para aplicações que executam lotes de operações para um ou mais serviços, com um mecanismo centralizado de gerenciamento de erros. A aplicação pode usar errors.As para acessar esses metadados de 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 }
Respostas de erro de API
As operações de serviço podem retornar tipos de erro modelados para indicar erros específicos. Esses tipos modelados podem ser usados com errors.As para desempacotar e determinar se a falha na operação foi causada por um erro específico. Por exemplo, CreateBucket do Amazon S3 poderá retornar um erro BucketAlreadyExists
Por exemplo, para verificar se um erro foi de 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 os erros de resposta da API de serviço implementam o tipo de interface 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 }
Recuperar identificadores de solicitação
Ao trabalhar com o AWS Support, podem pedir o identificador da solicitação que identifica a solicitação que você está tentando solucionar. Você pode usar http.ResponseErrorServiceRequestID() para recuperar o identificador da solicitação associado à resposta de erro.
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 solicitação do Amazon S3
As solicitações do Amazon S3 contêm identificadores adicionais que podem ser usados para ajudar o AWS Support a solucionar sua solicitação. Você pode usar s3.ResponseErrorServiceRequestID() e ServiceHostID() para recuperar o ID da solicitação e o ID do 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 }