Tratamento de erros no AWS SDK para Rust
Compreender como e quando o AWS SDK para Rust retorna erros é importante para compilar aplicações 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 tipo Result 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
Quando você encontra um SdkError::ServiceError, a requisição foi enviada com êxito para o AWS service (Serviço da AWS), mas não foi possível processá-la com êxito. Isso pode ser por causa de erros nos parâmetros da requisição ou problemas no lado do serviço.
Os detalhes da resposta de erro são incluídos na variante do erro. O exemplo a seguir mostra como acessar convenientemente a variante ServiceError 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 característica
fornece acesso a qualquer código de erro bruto subjacente disponível e mensagem de erro retornada do serviço.<service>::error::ProvideErrorMetadata-
Para o Amazon S3, essa característica é
aws_sdk_s3::error::ProvideErrorMetadata.
-
Você também pode obter informações que podem ser úteis para solucionar erros de serviço:
-
A característica
adiciona métodos de extensão para recuperar o ID de solicitação da AWS exclusivo gerado pelo serviço.<service>::operation::RequestId-
Para o Amazon S3, essa característica é
aws_sdk_s3::operation::RequestId.
-
-
A característica
adiciona o método<service>::operation::RequestIdExtextended_request_id()para obter um ID de solicitação adicional estendido.-
Compatível apenas com alguns serviços.
-
Para o Amazon S3, essa característica é
aws_sdk_s3::operation::RequestIdExt.
-
Erro detalhado de impressão com DisplayErrorContext
Os erros no SDK geralmente são resultado de uma cadeia de falhas, como:
-
O envio de uma solicitação falhou porque o conector retornou um erro.
-
O conector retornou um erro porque o provedor de credenciais retornou um erro.
-
O provedor de credenciais retornou um erro porque chamou um serviço e esse serviço retornou um erro.
-
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 estrutura
adiciona funcionalidade para gerar o contexto de erro completo.<service>::error::DisplayErrorContext-
Para o Amazon S3, essa estrutura é
aws_sdk_s3::error::DisplayErrorContext.
-
Quando agrupamos o erro a ser exibido e o imprimimos, o 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 } } )