Belgelere geç
C#

Hatalar ve yeniden denemeler

Her ret için tek bir özel durum türü, her tür için bir özellik ve iki kez gönderemeyen yeniden denemeler.

Bir hatayı ele alma

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");}

API'den gelen bir ret OpenEmailApiException fırlatır, hiç yanıt gelmemesi ise OpenEmailNetworkException fırlatır. İkisi de OpenEmailException türünden türer; bu yüzden tek bir catch ikisini de yakalar ve bir when filtresi türü seçer.

ÖzellikNe tutar
StatusHTTP durumu.
ErrorType, CodeAPI'nin hata türü ve kodu; örneğin validation_error ve invalid_parameter.
ParamVarsa, soruna yol açan alan.
RequestIdDesteğe yazarken belirteceğiniz kimlik.
DocUrlKodu açıklayan belge sayfası.
RetryAfterSecondsAPI'nin sizden ne kadar beklemenizi istediği, saniye cinsinden.
FieldsBir kayıt formunun reddettiği alanlar; her birinin bir key ve bir error değeri vardır.
BodyÇözülmüş yanıt gövdesi.

Başarısızlık türleri

ÖzellikNe zaman doğrudur
IsAuthAnahtar ya da belirteç reddedildi, 401 ile.
IsPermissionKimlik bilgisinin bunu yapmaya izni yok, 403 ile.
IsScopeMissingKimlik bilgisinde çağrının gerektirdiği kapsam eksik.
IsStepUpRequiredBir erişim belirtecinin önce bir kodu doğrulaması gerekiyor.
IsNotFoundBu kimliğe sahip hiçbir şey yok, 404 ile.
IsConflictDeğişiklik mevcut durumla çakışıyor, 409 ile.
IsValidationBir alan reddedildi, 422 ile.
IsRateLimitedÇok fazla istek var ya da bir kota tükendi, 429 ile.
IsInvalidRequestİsteğin diğer tüm retleri.
IsServerErrorAPI başarısız oldu, 500 ya da üzeri bir durumla.
IsRetryableDurum, istemcinin yeniden denediklerinden biri.
IsTimeoutZaman aşımından önce hiçbir yanıt gelmedi. Bu özellik OpenEmailNetworkException üzerindedir.

Hatalı biçimli bir anahtar ya da boş bir kimlik gibi çağrının kendisindeki bir hata, hiçbir şey gönderilmeden önce ArgumentException fırlatır. İptal edilmiş bir belirteç OperationCanceledException fırlatır, denetimi geçemeyen bir webhook teslimatı ise OpenEmailWebhookException fırlatır.

Doğrulama kodu

Bir erişim belirteci bir kişi adına işlem yapar; bu yüzden bir alan adını silmek gibi hassas bir değişiklikten önce ondan, web uygulamasının istediği doğrulama kodunun aynısı istenir. Bir kod isteyin, kodu doğrulayın, ardından isteği yeniden yapın. API anahtarlarından hiçbir zaman kod istenmez.

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);}

Neler yeniden denenir

  • Okumalar, gönderimler ve yinelenmesi güvenli olan her yazma, en çok MaxRetries kez yeniden denenir. Diğer her yazma bir kez gönderilir.
  • 408, 500, 502, 503 ve 504 durumları, yarım saniyeden başlayıp sekiz saniyeye kadar ikiye katlanan bir beklemeyle yeniden denenir.
  • Bir 429 yalnızca bir dakika ya da daha kısa bir Retry-After taşıdığında yeniden denenir ve istemci o kadar bekler.
  • Başarısız olan ya da zaman aşımına uğrayan bir bağlantı aynı şekilde yeniden denenir.

Yeniden denenen bir gönderim her seferinde aynı idempotency anahtarını taşır, böylece API ikinci bir ileti göndermek yerine ilk iletiyi yineler.