Gerenciamento de erros - AWS SDK para Rust

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Gerenciamento de erros

Entender como e quando os erros AWS SDK para Rust retornam é importante para criar aplicativos de alta qualidade usando o SDK. As seções a seguir descrevem os diferentes erros que você pode encontrar no SDK e como lidar com eles adequadamente.

Cada operação retorna um Result tipo com o tipo de erro definido como SdkError<E, R = HttpResponse>. SdkErroré uma enumeração com vários tipos possíveis, chamados de variantes.

Erros de serviço

O tipo de erro mais comum é SdkError::ServiceError. Esse erro representa uma resposta de erro de um AWS service (Serviço da AWS). Por exemplo, se você tentar obter um objeto do Amazon S3 que não existe, o Amazon S3 retornará uma resposta de erro.

Quando você encontra umSdkError::ServiceError, isso significa que sua solicitação foi enviada com sucesso para o AWS service (Serviço da AWS) , mas não pôde ser processada. Isso pode ser por causa de erros nos parâmetros da requisição ou problemas no lado do serviço.

Os detalhes da resposta ao erro estão incluídos na variante de erro. O exemplo a seguir mostra como acessar convenientemente a ServiceError variante subjacente e lidar com diferentes casos de erro:

// 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()) } };

Metadados de erro

Cada erro de serviço tem metadados adicionais que podem ser acessados importando características específicas do serviço.

  • A <service>::error::ProvideErrorMetadata característica fornece acesso a qualquer código de erro bruto subjacente disponível e mensagem de erro retornada do serviço.

Você também pode obter informações que podem ser úteis para solucionar erros de serviço:

  • A <service>::operation::RequestId característica adiciona métodos de extensão para recuperar o ID de AWS solicitação exclusivo que foi gerado pelo serviço.

  • A <service>::operation::RequestIdExt característica adiciona o extended_request_id() método para obter um ID de solicitação adicional estendido.

Erro detalhado de impressão com DisplayErrorContext

Os erros no SDK geralmente são o resultado de uma cadeia de falhas, como:

  1. O envio de uma solicitação falhou porque o conector retornou um erro.

  2. O conector retornou um erro porque o provedor de credenciais retornou um erro.

  3. O provedor de credenciais retornou um erro porque chamou um serviço e esse serviço retornou um erro.

  4. O serviço retornou um erro porque a solicitação de credenciais não tinha a autorização correta.

Por padrão, a exibição desse erro só gera “falha de despacho”. Isso carece de detalhes que ajudem a solucionar o erro. O SDK para Rust fornece um relator de erros simples chamado. DisplayErrorContext

  • A <service>::error::DisplayErrorContext estrutura adiciona funcionalidade para gerar o contexto de erro completo.

Quando agrupamos o erro a ser exibido e o imprimimos, DisplayErrorContext fornece uma mensagem muito mais detalhada, semelhante à seguinte:

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