Gabimet dhe riprovimet
Një tip i vetëm përjashtimi për çdo refuzim, një veti për çdo lloj dhe riprovime që nuk mund të dërgojnë dy herë.
Trajtimi i një gabimi
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");}Një refuzim nga API-ja hedh OpenEmailApiException, dhe mungesa e plotë e përgjigjes hedh OpenEmailNetworkException. Të dyja rrjedhin nga OpenEmailException, kështu që një catch i vetëm e kap cilëndo, dhe një filtër when zgjedh llojin.
| Vetia | Çfarë mban |
|---|---|
| Status | Statusi HTTP. |
| ErrorType, Code | Tipi i gabimit dhe kodi i API-së, si validation_error dhe invalid_parameter. |
| Param | Fusha që e ka fajin, kur ka një të tillë. |
| RequestId | Id-ja që duhet të citoni kur i shkruani mbështetjes. |
| DocUrl | Faqja e dokumentimit që shpjegon kodin. |
| RetryAfterSeconds | Sa ju kërkoi API-ja të prisni, në sekonda. |
| Fields | Fushat që refuzoi një formular regjistrimi, secila me një key dhe një error. |
| Body | Trupi i dekoduar i përgjigjes. |
Llojet e dështimit
| Vetia | Kur është e vërtetë |
|---|---|
| IsAuth | Çelësi ose tokeni u refuzua, me një 401. |
| IsPermission | Kredenciali nuk lejohet ta bëjë këtë, me një 403. |
| IsScopeMissing | Kredencialit i mungon scope-i që i duhet thirrjes. |
| IsStepUpRequired | Një token aksesi duhet të verifikojë së pari një kod. |
| IsNotFound | Asgjë nuk e ka atë id, me një 404. |
| IsConflict | Ndryshimi bie ndesh me gjendjen aktuale, me një 409. |
| IsValidation | Një fushë u refuzua, me një 422. |
| IsRateLimited | Shumë kërkesa, ose një kuotë është shpenzuar, me një 429. |
| IsInvalidRequest | Çdo refuzim tjetër i kërkesës. |
| IsServerError | API-ja dështoi, me një status 500 ose më të lartë. |
| IsRetryable | Statusi është nga ata që klienti i riprovon. |
| IsTimeout | Asnjë përgjigje nuk mbërriti para afatit kohor. Kjo ndodhet te OpenEmailNetworkException. |
Një gabim në vetë thirrjen, si një çelës i keqformuar ose një id bosh, hedh ArgumentException para se të dërgohet ndonjë gjë. Një token i anuluar hedh OperationCanceledException, dhe një dorëzim webhook-u që dështon në kontroll hedh OpenEmailWebhookException.
Një kod verifikimi
Një token aksesi vepron në emër të një personi, prandaj para një ndryshimi të ndjeshëm, si fshirja e një domeni, atij i kërkohet i njëjti kod verifikimi që kërkon aplikacioni web. Kërkoni një kod, kontrollojeni, pastaj bëjeni kërkesën sërish. Çelësave API nuk u kërkohet kurrë një i tillë.
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);}Çfarë riprovohet
- Leximet, dërgimet dhe çdo shkrim që është i sigurt për t'u përsëritur riprovohen, deri në
MaxRetriesherë. Çdo shkrim tjetër dërgohet një herë. - Statuset 408, 500, 502, 503 dhe 504 riprovohen me një pritje që nis nga gjysmë sekonde dhe dyfishohet deri në tetë sekonda.
- Një 429 riprovohet vetëm kur mban një
Retry-Afterprej një minute ose më pak, dhe klienti pret aq gjatë. - Një lidhje që dështon ose që e kalon afatin kohor riprovohet në të njëjtën mënyrë.
Një dërgim që riprovohet mban çdo herë të njëjtin çelës idempotence, kështu që API-ja e përsërit mesazhin e parë në vend që të dërgojë një të dytë.