Para brindar una experiencia del usuario más coherente, interpreta los errores de forma proactiva y responde a ellos. Ya sea que desarrolles flujos de trabajo automatizados en la nube o interactúes con APIs remotas, las bibliotecas cliente de Rust proporcionan formas de controlar los errores correctamente. En esta guía, se explica cómo hacer lo siguiente:
- Controlar errores: Inspeccionar los tipos de errores y bifurcar la lógica de la aplicación según los códigos de estado del servicio, como crear un recurso faltante cuando se encuentra un error
NotFound - Examinar los detalles del error: Extraer y examinar los detalles de errores enriquecidos, como las infracciones de campos de solicitudes incorrectas o las fallas de cuota, que devuelven los Google Cloud servicios para solucionar problemas de la API y ajustar de forma dinámica el comportamiento del tiempo de ejecución
- Resolver errores de vinculación: Interpretar y resolver errores de vinculación HTTP del cliente causados por campos de solicitud no válidos o faltantes para garantizar que tus solicitudes lleguen al servicio sin problemas
Requisitos previos
En esta guía, se usan el servicio de Secret Manager y la API de Cloud Natural Language para demostrar el manejo de errores. Para ejecutar los ejemplos, primero haz lo siguiente:
- Habilita el servicio de Secret Manager.
- Habilita la API de Cloud Natural Language.
- Configura la autenticación.
Dependencias
Usa el siguiente comando para agregar las dependencias necesarias a tu archivo Cargo.toml:
cargo add google-cloud-secretmanager-v1 google-cloud-gax crc32c google-cloud-language-v2
Soluciona errores
Las bibliotecas cliente de Rust te permiten mostrar errores y reaccionar ante ellos. Por ejemplo, puedes usar la detección de errores para bifurcar el comportamiento: un patrón común en los servicios en la nube es usar un recurso como si existiera el contenedor, y solo crear el contenedor si encuentras un error. Si el contenedor suele existir, este enfoque es más eficiente que verificar si el contenedor existe antes de realizar la solicitud.
En el siguiente ejemplo, se muestra cómo controlar un recurso faltante mediante la captura del error cuando se intenta actualizar un secreto de Secret Manager y cómo crearlo si aún no existe.
Intenta crear una versión secreta nueva:
Si
update_attempttiene éxito, imprime el resultado correcto y regresa:Si
update_attemptfalla, debes desambiguar la causa de la falla. La solicitud podría haber fallado por muchos motivos, como una conexión interrumpida o un error con los tokens de autenticación. Las políticas de reintento pueden abordar la mayoría de estos errores. Busca los errores que devuelve el servicio:Busca un error que corresponda a un secreto faltante:
Si encontraste un error "no encontrado" (
Code::NotFound), intenta crear el secreto:Intenta agregar la versión secreta de nuevo. Esta vez, muestra un error si falla algo:
Muestra de código: función principal (sample)
El código completo de este ejemplo se divide en tres partes: la función de organización principal (sample) y sus dos métodos auxiliares (update_attempt y create_secret).
La función sample intenta agregar una versión nueva a un secreto. Captura el error que devuelve el cliente y verifica si es un error Code::NotFound. Si no se encuentra el secreto, la función crea el secreto que falta inicialmente y vuelve a intentar la actualización.
Muestra de código: método auxiliar (update_attempt)
El método auxiliar update_attempt intenta agregar una versión secreta y calcula la suma de verificación CRC32c de los datos de la carga útil:
Muestra de código: método auxiliar (create_secret)
El método auxiliar create_secret crea un secreto faltante y configura una política de reintento personalizada:
Examina los detalles del error
Algunos Google Cloud servicios incluyen detalles de errores adicionales cuando fallan las solicitudes.
Para ayudar con la solución de problemas, las bibliotecas cliente de Rust incluyen estos detalles cuando se formatean errores con std::fmt::Display. Puedes examinar estos detalles y cambiar el comportamiento de tu aplicación en consecuencia.
Solo los errores que devuelve el servicio contienen información detallada. Las bibliotecas cliente muestran una
StatusDetails
enumeración con los diferentes tipos de detalles de errores.
Extrae los detalles del error
En este ejemplo, se envía de forma intencional una solicitud incorrecta a la API de Cloud Natural Language y se examina el error resultante.
Crea un cliente:
Envía una solicitud (en este ejemplo, falta un campo clave):
Extrae el error del resultado con las funciones estándar de Rust. El tipo de error imprime todos los detalles del error en un formato legible por humanos:
El resultado es similar a este:
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: {},
},
),
],
},
},
}
Examina los detalles del error de forma programática
A veces, es posible que debas examinar los detalles del error de forma programática. En este ejemplo, se atraviesa la estructura de datos y se imprimen los campos más relevantes.
Solo los errores que devuelve el servicio contienen información detallada, por lo que primero consulta el error para ver si contiene el tipo de error correcto. Si lo hace, puedes desglosar información de nivel superior sobre el error:
Itera sobre los detalles:
Como se mencionó anteriormente, las bibliotecas cliente muestran una
StatusDetails
enumeración con los diferentes tipos de detalles de errores. En este ejemplo, solo se examinan los errores BadRequest:
Un BadRequest contiene una lista de campos que están en infracción. Puedes iterar e imprimir los detalles de cada uno:
Esa información puede ser útil durante el desarrollo. Otras ramas de
StatusDetails, como
QuotaFailure,
pueden ser útiles en el tiempo de ejecución para limitar una aplicación.
Resultado esperado
El resultado de los detalles del error es similar al siguiente:
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."
Código de muestra: Examina los detalles del error
La función sample envía una solicitud intencionalmente no válida a la API de Cloud Natural Language para generar un error de servicio. Luego, captura el error y extrae de forma programática el StatusDetails para inspeccionar e imprimir infracciones específicas del campo BadRequest.
Resuelve errores de vinculación
Cuando se usa HTTP para enviar solicitudes a Google Cloud servicios, la solicitud usa un identificador de recursos uniforme (URI) para especificar un recurso. Algunas RPC corresponden a varios URIs, y el contenido de la solicitud determina qué URI se usa.
La biblioteca cliente considera todos los URIs posibles y solo muestra un error de vinculación si no funciona ningún URI. Por lo general, esto sucede cuando falta un campo o tiene un formato no válido.
Si tu solicitud no proporciona campos que contengan un formato válido para cualquier URI posible, es posible que encuentres un error de vinculación:
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/*'
El error del ejemplo anterior ocurrió porque el ejemplo intenta recuperar los detalles de un recurso sin proporcionar su nombre. En particular, el campo name field
en un GetSecretRequest
es obligatorio, pero el ejemplo no lo establece:
Cómo corregir errores de vinculación
Para corregir el error, configura el campo obligatorio de modo que coincida con una de las plantillas que se muestran en el mensaje de error:
'projects/*/secrets/*''projects/*/locations/*/secrets/*'
Cualquiera de las plantillas permite que la biblioteca cliente realice una solicitud al servidor. Por ejemplo, el siguiente código coincide con la primera plantilla:
Como alternativa, el siguiente código coincide con la segunda plantilla:
Interpretación de plantillas
El mensaje de error de un error de vinculación incluye cadenas de plantilla que muestran los valores posibles para los campos de solicitud. La mayoría de las cadenas de plantilla incluyen * y ** como
comodines para que coincidan con los valores de los campos.
Comodín único
El comodín * por sí solo significa una cadena no vacía sin un /. Se puede considerar como la expresión regular [^/]+.
Estos son algunos ejemplos:
| Plantilla | Entrada | ¿Alguna coincidencia? |
|---|---|---|
* |
simple-string-123 |
true |
projects/* |
projects/p |
true |
projects/*/locations |
projects/p/locations |
true |
projects/*/locations/* |
projects/p/locations/l |
true |
* |
"" (vacío) |
false |
* |
string/with/slashes |
false |
projects/* |
projects/ (vacío) |
false |
projects/* |
projects/p/ (barra adicional) |
false |
projects/* |
projects/p/locations/l |
false |
projects/*/locations |
projects/p |
false |
projects/*/locations |
projects/p/locations/l |
false |
Comodín doble
Menos común es el comodín **, que significa cualquier cadena. La cadena puede estar
vacía o contener cualquier cantidad de barras (/). Se puede considerar como la
expresión regular .*.
Cuando una plantilla termina en /**, la barra inicial es opcional.
| Plantilla | Entrada | ¿Alguna coincidencia? |
|---|---|---|
** |
"" |
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 |
Inspecciona errores de vinculación
Si necesitas inspeccionar el error de forma programática, verifica si es un error de vinculación y conviértelo en un BindingError:
¿Qué sigue?
- Obtén información para configurar las políticas de reintento.