Aller à la documentation
C#

Erreurs et nouvelles tentatives

Un seul type d'exception pour chaque refus, une propriété pour chaque genre, et des nouvelles tentatives qui ne peuvent pas envoyer deux fois.

Gérer une erreur

errors.cs
try{    await client.Emails.SendAsync(new Body    {        ["from"] = "[email protected]",        ["to"] = "[email protected]",        ["subject"] = "Your September invoice",        ["text"] = "Invoice attached.",    });}catch (OpenEmailApiException error) when (error.IsValidation){    Console.Error.WriteLine($"{error.Code} {error.Param} {error.Message}");}catch (OpenEmailApiException error) when (error.IsRateLimited){    Console.Error.WriteLine($"try again in {error.RetryAfterSeconds} seconds");}catch (OpenEmailNetworkException error) when (error.IsTimeout){    Console.Error.WriteLine("no answer in time");}

Un refus de l'API lève OpenEmailApiException, et l'absence totale de réponse lève OpenEmailNetworkException. Les deux dérivent d'OpenEmailException : un seul catch attrape donc l'une comme l'autre, et un filtre when choisit le genre.

PropriétéCe qu'il contient
StatusLe statut HTTP.
ErrorType, 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.
RetryAfterSecondsLe temps que l'API vous a demandé d'attendre, en secondes.
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

PropriétéQuand elle est vraie
IsAuthLa clé ou le jeton a été refusé, avec un 401.
IsPermissionL'identifiant n'a pas le droit de faire cela, avec un 403.
IsScopeMissingIl manque à l'identifiant la portée dont l'appel a besoin.
IsStepUpRequiredUn jeton d'accès doit d'abord valider un code.
IsNotFoundRien ne porte cet identifiant, avec un 404.
IsConflictLe changement entre en conflit avec l'état actuel, avec un 409.
IsValidationUn champ a été refusé, avec un 422.
IsRateLimitedTrop de requêtes, ou un quota est épuisé, avec un 429.
IsInvalidRequestTout autre refus de la requête.
IsServerErrorL'API a échoué, avec un statut de 500 ou plus.
IsRetryableLe statut fait partie de ceux que le client retente.
IsTimeoutAucune réponse n'est arrivée avant la fin du délai. Celle-ci se trouve sur OpenEmailNetworkException.

Une erreur dans l'appel lui-même, comme une clé mal formée ou un identifiant vide, lève ArgumentException avant tout envoi. Un jeton annulé lève OperationCanceledException, et une livraison de webhook qui échoue à sa vérification lève OpenEmailWebhookException.

Un code de vérification

Un jeton d'accès agit pour une personne : avant un changement sensible, comme la suppression d'un domaine, on lui demande donc le même code de vérification que celui que demande l'application web. Demandez un code, vérifiez-le, puis refaites la requête. On ne demande jamais de code aux clés API.

step-up.cs
var domainId = "b3e1f0a4-6c2d-4e8a-9f17-2d5c8a0b4e6f"; try{    await client.Domains.DeleteAsync(domainId);}catch (OpenEmailApiException error) when (error.IsStepUpRequired){    var challenge = await client.Security.BeginStepUpAsync();     Console.WriteLine($"Enter the code sent by {challenge["method"]}");     await client.Security.VerifyStepUpAsync(new Body { ["code"] = Console.ReadLine()?.Trim() });    await client.Domains.DeleteAsync(domainId);}

Ce qui est retenté

  • Les lectures, les envois et toute écriture qui peut être répétée sans risque sont retentés, jusqu'à MaxRetries 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.