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
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.
| Özellik | Ne tutar |
|---|---|
| Status | HTTP durumu. |
| ErrorType, Code | API'nin hata türü ve kodu; örneğin validation_error ve invalid_parameter. |
| Param | Varsa, soruna yol açan alan. |
| RequestId | Desteğe yazarken belirteceğiniz kimlik. |
| DocUrl | Kodu açıklayan belge sayfası. |
| RetryAfterSeconds | API'nin sizden ne kadar beklemenizi istediği, saniye cinsinden. |
| Fields | Bir 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
| Özellik | Ne zaman doğrudur |
|---|---|
| IsAuth | Anahtar ya da belirteç reddedildi, 401 ile. |
| IsPermission | Kimlik bilgisinin bunu yapmaya izni yok, 403 ile. |
| IsScopeMissing | Kimlik bilgisinde çağrının gerektirdiği kapsam eksik. |
| IsStepUpRequired | Bir erişim belirtecinin önce bir kodu doğrulaması gerekiyor. |
| IsNotFound | Bu kimliğe sahip hiçbir şey yok, 404 ile. |
| IsConflict | Değişiklik mevcut durumla çakışıyor, 409 ile. |
| IsValidation | Bir 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. |
| IsServerError | API başarısız oldu, 500 ya da üzeri bir durumla. |
| IsRetryable | Durum, istemcinin yeniden denediklerinden biri. |
| IsTimeout | Zaman 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.
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
MaxRetrieskez 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-Aftertaşı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.