Hatalar ve yeniden denemeler
Her ret türü için bir istisna sınıfı ve iki kez gönderemeyen yeniden denemeler.
Bir hatayı ele alma
try { client.templates().send("order-shipped", Body.of( "from", "[email protected]", "to", "[email protected]", "props", Body.of("orderId", "AC-4192") ));} catch (ValidationException error) { System.err.println(error.param() + " " + error.getMessage());} catch (RateLimitException error) { System.err.println("Wait " + error.retryAfterSeconds() + " seconds");} catch (ApiException error) { System.err.println(error.status() + " " + error.code() + " " + error.requestId());} catch (NetworkException error) { System.err.println(error.isTimeout() ? "Timed out" : "No response");}API'den gelen bir ret, API'nin onun hakkında söyledikleriyle birlikte bir ApiException ya da türüne ait alt sınıfı fırlatır. İstemcinin fırlattığı her istisna denetlenmeyen bir OpenEmailException değeridir, bu yüzden tek bir catch hepsini kapsar.
| Metot | Ne tutar |
|---|---|
| status() | HTTP durumu ya da hiç yanıt gelmediğinde 0. |
| type(), 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 ne kadar beklemenizi istediği. |
| 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
| İstisna | Ne zaman fırlatılır |
|---|---|
| AuthenticationException | Anahtar ya da belirteç reddedildi, 401 ile. |
| PermissionException | Kimlik bilgisinin bunu yapmaya izni yok, 403 ile. |
| NotFoundException | Bu kimliğe sahip hiçbir şey yok, 404 ile. |
| ConflictException | Değişiklik mevcut durumla çakışıyor, 409 ile. |
| ValidationException | Bir alan reddedildi, 422 ile. |
| RateLimitException | Çok fazla istek var ya da bir kota tükendi, 429 ile. |
| InvalidRequestException | İsteğin diğer tüm retleri. |
| ApiException | API başarısız oldu, 500 ya da üzeri bir durumla. |
| NetworkException | Hiç yanıt gelmedi. |
| IllegalArgumentException | Çağrının kendisi yanlıştı ve hiçbir şey gönderilmedi. |
| WebhookSignatureException | Bir webhook teslimatı denetimini geçemedi. |
Bir ApiException kendisi hakkındaki soruları da yanıtlar: isValidation(), isNotFound(), isRateLimited(), isServerError() ve isRetryable(); ayrıca kimlik bilgisinde çağrının gerektirdiği kapsam eksikse isScopeMissing(), bir erişim belirtecinin önce bir kodu doğrulaması gerekiyorsa isStepUpRequired(). NetworkException.isTimeout() ise sürenin dolduğunu söyler.
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.