Ir a la documentación
Go

Errores y reintentos

Un único tipo de error para cada fallo, un centinela para cada clase y reintentos que no pueden enviar dos veces.

Gestionar un error

errors.go
_, err := client.Emails.Send(ctx, openemail.Body{	"from":    "[email protected]",	"to":      "[email protected]",	"subject": "Your September invoice",	"text":    "Invoice attached.",}) var failure *openemail.Error switch {case err == nil:	fmt.Println("sent")case errors.Is(err, openemail.ErrValidation):	errors.As(err, &failure)	fmt.Println(failure.Code, failure.Param, failure.Message)case errors.Is(err, openemail.ErrRateLimited):	errors.As(err, &failure)	fmt.Println("try again in", failure.RetryAfter)case errors.Is(err, openemail.ErrTimeout):	fmt.Println("no answer in time")default:	return err}

Cada fallo es un *openemail.Error. errors.Is dice de qué clase es, y errors.As entrega el propio error, con lo que la API dijo sobre él.

CampoQué contiene
StatusEl estado HTTP, o 0 cuando no llegó ninguna respuesta.
Type, CodeEl tipo de error y el código de la API, como validation_error e invalid_parameter.
ParamEl campo culpable, cuando lo hay.
RequestIDEl id que debes citar cuando escribas a soporte.
DocURLLa página de la documentación que explica el código.
RetryAfterCuánto te pidió la API que esperaras.
FieldsLos campos que rechazó un formulario de suscripción, cada uno con una Key y un Error.
BodyEl cuerpo de la respuesta, decodificado.

Las clases de fallo

CentinelaCuándo coincide
ErrAuthenticationLa clave o el token fue rechazado, con un 401.
ErrPermissionLa credencial no puede hacer esto, con un 403.
ErrScopeMissingA la credencial le falta el ámbito que la llamada necesita.
ErrStepUpRequiredUn token de acceso tiene que verificar antes un código.
ErrNotFoundNada tiene ese id, con un 404.
ErrConflictEl cambio entra en conflicto con el estado actual, con un 409.
ErrValidationSe rechazó un campo, con un 422.
ErrRateLimitedDemasiadas peticiones, o una cuota está agotada, con un 429.
ErrInvalidRequestCualquier otro rechazo de la petición.
ErrServerLa API falló, con un estado de 500 o superior.
ErrRetryableEl estado es uno de los que el cliente reintenta.
ErrNetworkNo llegó ninguna respuesta.
ErrTimeoutNo llegó ninguna respuesta antes de que venciera el tiempo de espera.
ErrInvalidArgumentLa propia llamada era incorrecta, y no se envió nada.
ErrWebhookSignatureUna entrega de webhook no superó su comprobación.

Un contexto cancelado sigue coincidiendo con context.Canceled, y un plazo vencido coincide con context.DeadlineExceeded.

Lo que se reintenta

  • Las lecturas, los envíos y toda escritura que es seguro repetir se reintentan, hasta WithMaxRetries veces. Cualquier otra escritura se envía una sola vez.
  • Los estados 408, 500, 502, 503 y 504 se reintentan con una espera que empieza en medio segundo y se duplica hasta ocho segundos.
  • Un 429 se reintenta solo cuando lleva un Retry-After de un minuto o menos, y el cliente espera ese tiempo.
  • Una conexión que falla o que agota el tiempo de espera se reintenta del mismo modo.

Un envío que se reintenta lleva siempre la misma clave de idempotencia, así que la API reproduce el primer mensaje en vez de enviar un segundo.