Aller à la documentation
Go

Erreurs et nouvelles tentatives

Un seul type d'erreur pour chaque échec, une sentinelle pour chaque genre, et des nouvelles tentatives qui ne peuvent pas envoyer deux fois.

Gérer une erreur

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}

Chaque échec est une *openemail.Error. errors.Is dit de quel genre il s'agit, et errors.As donne l'erreur elle-même, avec ce que l'API en a dit.

ChampCe qu'il contient
StatusLe statut HTTP, ou 0 quand aucune réponse n'est arrivée.
Type, CodeLe type d'erreur et le code de l'API, comme validation_error et invalid_parameter.
ParamLe champ en cause, quand il y en a un.
RequestIDL'identifiant à citer quand vous écrivez au support.
DocURLLa page de la documentation qui explique le code.
RetryAfterLe temps d'attente que l'API vous a demandé.
FieldsLes champs qu'un formulaire d'inscription a refusés, chacun avec une Key et une Error.
BodyLe corps de la réponse, décodé.

Les genres d'échec

SentinelleQuand elle correspond
ErrAuthenticationLa clé ou le jeton a été refusé, avec un 401.
ErrPermissionL'identifiant n'a pas le droit de faire cela, avec un 403.
ErrScopeMissingIl manque à l'identifiant la portée dont l'appel a besoin.
ErrStepUpRequiredUn jeton d'accès doit d'abord valider un code.
ErrNotFoundRien ne porte cet identifiant, avec un 404.
ErrConflictLe changement entre en conflit avec l'état actuel, avec un 409.
ErrValidationUn champ a été refusé, avec un 422.
ErrRateLimitedTrop de requêtes, ou un quota est épuisé, avec un 429.
ErrInvalidRequestTout autre refus de la requête.
ErrServerL'API a échoué, avec un statut de 500 ou plus.
ErrRetryableLe statut fait partie de ceux que le client retente.
ErrNetworkAucune réponse n'est arrivée.
ErrTimeoutAucune réponse n'est arrivée avant la fin du délai.
ErrInvalidArgumentL'appel lui-même était erroné, et rien n'a été envoyé.
ErrWebhookSignatureUne livraison de webhook a échoué à sa vérification.

Un contexte annulé correspond toujours à context.Canceled, et une échéance dépassée correspond à context.DeadlineExceeded.

Ce qui est retenté

  • Les lectures, les envois et toute écriture qui peut être répétée sans risque sont retentés, jusqu'à WithMaxRetries fois. Toute autre écriture est envoyée une seule fois.
  • Les statuts 408, 500, 502, 503 et 504 sont retentés avec une attente qui commence à une demi-seconde et double jusqu'à huit secondes.
  • Un 429 n'est retenté que s'il porte un Retry-After d'une minute ou moins, et le client attend ce temps.
  • Une connexion qui échoue ou qui dépasse le délai est retentée de la même façon.

Un envoi retenté porte chaque fois la même clé d'idempotence : l'API rejoue donc le premier message au lieu d'en envoyer un second.