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
_, 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.
| Champ | Ce qu'il contient |
|---|---|
| Status | Le statut HTTP, ou 0 quand aucune réponse n'est arrivée. |
| Type, Code | Le type d'erreur et le code de l'API, comme validation_error et invalid_parameter. |
| Param | Le champ en cause, quand il y en a un. |
| RequestID | L'identifiant à citer quand vous écrivez au support. |
| DocURL | La page de la documentation qui explique le code. |
| RetryAfter | Le temps d'attente que l'API vous a demandé. |
| Fields | Les champs qu'un formulaire d'inscription a refusés, chacun avec une Key et une Error. |
| Body | Le corps de la réponse, décodé. |
Les genres d'échec
| Sentinelle | Quand elle correspond |
|---|---|
| ErrAuthentication | La clé ou le jeton a été refusé, avec un 401. |
| ErrPermission | L'identifiant n'a pas le droit de faire cela, avec un 403. |
| ErrScopeMissing | Il manque à l'identifiant la portée dont l'appel a besoin. |
| ErrStepUpRequired | Un jeton d'accès doit d'abord valider un code. |
| ErrNotFound | Rien ne porte cet identifiant, avec un 404. |
| ErrConflict | Le changement entre en conflit avec l'état actuel, avec un 409. |
| ErrValidation | Un champ a été refusé, avec un 422. |
| ErrRateLimited | Trop de requêtes, ou un quota est épuisé, avec un 429. |
| ErrInvalidRequest | Tout autre refus de la requête. |
| ErrServer | L'API a échoué, avec un statut de 500 ou plus. |
| ErrRetryable | Le statut fait partie de ceux que le client retente. |
| ErrNetwork | Aucune réponse n'est arrivée. |
| ErrTimeout | Aucune réponse n'est arrivée avant la fin du délai. |
| ErrInvalidArgument | L'appel lui-même était erroné, et rien n'a été envoyé. |
| ErrWebhookSignature | Une 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'à
WithMaxRetriesfois. 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-Afterd'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.