Ofereça uma experiência do usuário mais consistente interpretando e respondendo a erros de maneira proativa. Se você estiver desenvolvendo fluxos de trabalho automatizados na nuvem ou interagindo com APIs remotas, as bibliotecas de cliente do Rust oferecem maneiras de lidar com erros normalmente. Este guia explica como:
- Tratar erros:inspecione os tipos de erro e ramifique a lógica do aplicativo com base em códigos de status do serviço, como criar um recurso ausente ao encontrar um erro
NotFound. - Examinar detalhes do erro: extraia e examine detalhes de erros avançados, como violações de campo de solicitação inválida ou falhas de cota, retornados por Google Cloud serviços para solucionar problemas de API e ajustar dinamicamente o comportamento de execução.
- Resolver erros de vinculação:interprete e resolva erros de vinculação HTTP do lado do cliente causados por campos de solicitação inválidos ou ausentes para garantir que as solicitações cheguem ao serviço sem problemas.
Pré-requisitos
Este guia usa o serviço Secret Manager e a API Cloud Natural Language para demonstrar o tratamento de erros. Para executar os exemplos, primeiro:
- Ative o serviço Secret Manager.
- Ative a API Cloud Natural Language.
- Configure a autenticação.
Dependências
Use o comando a seguir para adicionar as dependências necessárias ao arquivo Cargo.toml:
cargo add google-cloud-secretmanager-v1 google-cloud-gax crc32c google-cloud-language-v2
Tratar erros
As bibliotecas de cliente do Rust permitem que você mostre e reaja a erros. Por exemplo, você pode usar a descoberta de erros para ramificar o comportamento: um padrão comum em serviços de nuvem é usar um recurso como se o contêiner dele existisse, criando o contêiner somente se você encontrar um erro. Se o contêiner geralmente existir, essa abordagem será mais eficiente do que verificar se o contêiner existe antes de fazer a solicitação.
O exemplo a seguir demonstra como tratar um recurso ausente capturando o erro ao tentar atualizar um secret do Secret Manager e criando-o se ele ainda não existir.
Tente criar uma nova versão do secret:
Se
update_attemptfor bem-sucedido, imprima o resultado e retorne:Se
update_attemptfalhar, você precisará desambiguar a causa da falha. A solicitação pode ter falhado por vários motivos, como uma conexão interrompida ou um erro com tokens de autenticação. As políticas de novas tentativas podem lidar com a maioria desses erros. Procure erros retornados pelo serviço:Procure um erro que corresponda a um secret ausente:
Se você encontrou um erro "não encontrado" (
Code::NotFound), tente criar o secret:Tente adicionar a versão do secret novamente. Desta vez, retorne um erro se algo falhar:
Exemplo de código: função principal (sample)
O código completo deste exemplo é dividido em três partes: a função de orquestração principal (sample), seguida pelos dois métodos auxiliares (update_attempt e create_secret).
A função sample tenta adicionar uma nova versão a um secret. Ela captura o erro retornado pelo cliente e verifica se o erro é um Code::NotFound. Se o secret não for encontrado, a função criará o secret inicialmente ausente e tentará atualizar novamente.
Exemplo de código: método auxiliar (update_attempt)
O método auxiliar update_attempt tenta adicionar uma versão do secret, calculando a soma de verificação CRC32c dos dados de payload:
Exemplo de código: método auxiliar (create_secret)
O método auxiliar create_secret cria um secret ausente e configura uma política de novas tentativas personalizada:
Examinar detalhes do erro
Alguns Google Cloud serviços incluem mais detalhes de erros quando as solicitações falham.
Para ajudar na solução de problemas, as bibliotecas de cliente do Rust incluem esses detalhes ao formatar erros usando std::fmt::Display. Você pode examinar esses detalhes e mudar o comportamento do aplicativo de acordo com eles.
Somente os erros retornados pelo serviço contêm informações detalhadas. As bibliotecas de cliente retornam uma
StatusDetails
enumeração com os diferentes tipos de detalhes de erros.
Extrair detalhes do erro
Este exemplo envia intencionalmente uma solicitação inválida para a API Cloud Natural Language e examina o erro resultante.
Crie um cliente:
Envie uma solicitação (neste exemplo, um campo de chave está ausente):
Extraia o erro do resultado usando funções padrão do Rust. O tipo de erro imprime todos os detalhes do erro de forma legível:
O resultado será assim:
request failed with error Error {
kind: Service {
status_code: Some(
400,
),
headers: Some(
{
"vary": "X-Origin",
"vary": "Referer",
"vary": "Origin,Accept-Encoding",
"content-type": "application/json; charset=UTF-8",
"date": "Sat, 24 May 2025 17:19:49 GMT",
"server": "scaffolding on HTTPServer2",
"x-xss-protection": "0",
"x-frame-options": "SAMEORIGIN",
"x-content-type-options": "nosniff",
"alt-svc": "h3=\":443\"; ma=2592000,h3-29=\":443\"; ma=2592000",
"accept-ranges": "none",
"transfer-encoding": "chunked",
},
),
status: Status {
code: InvalidArgument,
message: "One of content, or gcs_content_uri must be set.",
details: [
BadRequest(
BadRequest {
field_violations: [
FieldViolation {
field: "document.content",
description: "Must have some text content to annotate.",
reason: "",
localized_message: None,
_unknown_fields: {},
},
],
_unknown_fields: {},
},
),
],
},
},
}
Examinar detalhes do erro de maneira programática
Às vezes, pode ser necessário examinar os detalhes do erro de maneira programática. Este exemplo percorre a estrutura de dados e imprime os campos mais relevantes.
Somente os erros retornados pelo serviço contêm informações detalhadas. Portanto, primeiro consulte o erro para verificar se ele contém o tipo de erro correto. Se for o caso, você poderá detalhar algumas informações de nível superior sobre o erro:
Itere os detalhes:
Como mencionado anteriormente, as bibliotecas de cliente retornam uma
StatusDetails
enumeração com os diferentes tipos de detalhes de erros. Este exemplo examina apenas erros BadRequest:
Um BadRequest contém uma lista de campos que estão em violação. Você pode iterar e imprimir os detalhes de cada um deles:
Essas informações podem ser úteis durante o desenvolvimento. Outras ramificações de
StatusDetails, como
QuotaFailure,
podem ser úteis no momento da execução para limitar um aplicativo.
Resposta esperada
A saída dos detalhes do erro é semelhante a esta:
status.code=400, status.message=One of content, or gcs_content_uri must be set., status.status=Some("INVALID_ARGUMENT")
the request field document.content has a problem: "Must have some text content to annotate."
Exemplo de código: examinar detalhes do erro
A função sample envia uma solicitação intencionalmente inválida para a API Cloud Natural Language para gerar um erro de serviço. Em seguida, ela captura o erro e extrai programaticamente o StatusDetails para inspecionar e imprimir violações de campo BadRequest específicas.
Resolver erros de vinculação
Ao usar HTTP para enviar solicitações aos Google Cloud serviços, a solicitação usa um identificador uniforme de recursos (URI, na sigla em inglês) para especificar um recurso. Algumas RPCs correspondem a vários URIs, e o conteúdo da solicitação determina qual URI é usado.
A biblioteca de cliente considera todos os URIs possíveis e só retorna um erro de vinculação se nenhum URI funcionar. Normalmente, isso acontece quando um campo está ausente ou em um formato inválido.
Se a solicitação não fornecer campos que contenham um formato válido para qualquer URI possível, você poderá encontrar um erro de vinculação:
Error: cannot find a matching binding to send the request: at least one of the
conditions must be met: (1) field `name` needs to be set and match the template:
'projects/*/secrets/*' OR (2) field `name` needs to be set and match the
template: 'projects/*/locations/*/secrets/*'
O erro de exemplo anterior ocorreu porque o exemplo tenta recuperar os detalhes de um recurso sem fornecer o nome dele. Especificamente, o campo name field
em um GetSecretRequest
é obrigatório, mas não é definido pelo exemplo:
Como corrigir erros de vinculação
Para corrigir o erro, defina o campo obrigatório para que ele corresponda a um dos modelos mostrados na mensagem de erro:
'projects/*/secrets/*''projects/*/locations/*/secrets/*'
Qualquer modelo permite que a biblioteca de cliente faça uma solicitação ao servidor. Por exemplo, o código a seguir corresponde ao primeiro modelo:
Como alternativa, o código a seguir corresponde ao segundo modelo:
Interpretação de modelos
A mensagem de erro de um erro de vinculação inclui strings de modelo que mostram valores possíveis para os campos de solicitação. A maioria das strings de modelo inclui * e ** como
caracteres curinga para corresponder aos valores de campo.
Caractere curinga único
O caractere curinga * sozinho significa uma string não vazia sem um /. Ele pode ser considerado como a expressão regular [^/]+.
Veja alguns exemplos:
| Modelo | Entrada | Corresponder? |
|---|---|---|
* |
simple-string-123 |
true |
projects/* |
projects/p |
true |
projects/*/locations |
projects/p/locations |
true |
projects/*/locations/* |
projects/p/locations/l |
true |
* |
"" (vazio) |
false |
* |
string/with/slashes |
false |
projects/* |
projects/ (vazio) |
false |
projects/* |
projects/p/ (barra extra) |
false |
projects/* |
projects/p/locations/l |
false |
projects/*/locations |
projects/p |
false |
projects/*/locations |
projects/p/locations/l |
false |
Caractere curinga duplo
Menos comum é o caractere curinga **, que significa qualquer string. A string pode estar
vazia ou conter qualquer número de barras (/). Ela pode ser considerada como a
expressão regular .*.
Quando um modelo termina em /**, a barra inicial é opcional.
| Modelo | Entrada | Corresponder? |
|---|---|---|
** |
"" |
true |
** |
simple-string-123 |
true |
** |
string/with/slashes |
true |
projects/*/** |
projects/p |
true |
projects/*/** |
projects/p/locations |
true |
projects/*/** |
projects/p/locations/l |
true |
projects/*/** |
locations/l |
false |
projects/*/** |
projects//locations/l |
false |
Inspecionar erros de vinculação
Se você precisar inspecionar o erro de maneira programática, verifique se ele é um erro de vinculação e faça o downcast para um BindingError:
A seguir
- Saiba mais sobre como configurar políticas de novas tentativas.