एरर और रीट्राई
हर तरह के इनकार के लिए एक एक्सेप्शन क्लास, और ऐसे रीट्राई जो दो बार नहीं भेज सकते।
एरर को संभालना
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 का इनकार एक ApiException या उसके प्रकार की सबक्लास थ्रो करता है, साथ में वह जो API ने उसके बारे में कहा। क्लाइंट जो भी एक्सेप्शन थ्रो करता है वह एक अनचेक्ड OpenEmailException है, इसलिए एक catch उन सबको सँभाल लेता है।
| मेथड | इसमें क्या है |
|---|---|
| status() | HTTP स्थिति, या 0 जब कोई जवाब नहीं आया। |
| type(), code() | API का एरर टाइप और कोड, जैसे validation_error और invalid_parameter। |
| param() | वह फ़ील्ड जो ज़िम्मेदार है, जब ऐसा कोई फ़ील्ड हो। |
| requestId() | वह id जो सहायता टीम को लिखते समय बतानी चाहिए। |
| docUrl() | दस्तावेज़ का वह पेज जो कोड को समझाता है। |
| retryAfterSeconds() | API ने आपको कितनी देर प्रतीक्षा करने को कहा। |
| fields() | वे फ़ील्ड जिन्हें साइन-अप फ़ॉर्म ने अस्वीकार किया, हर एक के साथ एक key और एक error। |
| body() | डिकोड की हुई जवाब बॉडी। |
विफलता के प्रकार
| एक्सेप्शन | यह कब थ्रो होता है |
|---|---|
| AuthenticationException | कुंजी या टोकन अस्वीकार हुआ, 401 के साथ। |
| PermissionException | इस क्रेडेंशियल को यह करने की अनुमति नहीं है, 403 के साथ। |
| NotFoundException | उस id वाली कोई चीज़ नहीं है, 404 के साथ। |
| ConflictException | बदलाव मौजूदा स्थिति से टकराता है, 409 के साथ। |
| ValidationException | एक फ़ील्ड अस्वीकार हुआ, 422 के साथ। |
| RateLimitException | बहुत ज़्यादा अनुरोध, या कोई कोटा खत्म हो गया, 429 के साथ। |
| InvalidRequestException | अनुरोध का कोई भी अन्य इनकार। |
| ApiException | API विफल हुआ, 500 या उससे ऊपर के स्टेटस के साथ। |
| NetworkException | कोई जवाब नहीं आया। |
| IllegalArgumentException | कॉल ही गलत थी, और कुछ नहीं भेजा गया। |
| WebhookSignatureException | एक वेबहुक डिलीवरी अपनी जाँच में विफल रही। |
एक ApiException अपने बारे में सवालों के जवाब भी देता है: isValidation(), isNotFound(), isRateLimited(), isServerError() और isRetryable(), साथ में isScopeMissing() जब क्रेडेंशियल के पास वह स्कोप न हो जो कॉल को चाहिए और isStepUpRequired() जब किसी एक्सेस टोकन को पहले एक कोड सत्यापित करना हो। NetworkException.isTimeout() बताता है कि समय सीमा निकल गई।
क्या दोबारा आज़माया जाता है
- पढ़ने वाली कॉल, भेजने वाली कॉल और हर वह लिखने वाली कॉल जिसे दोहराना सुरक्षित है,
maxRetriesबार तक दोबारा आज़माई जाती है। कोई भी अन्य लिखने वाली कॉल एक बार भेजी जाती है। - स्टेटस 408, 500, 502, 503 और 504 को ऐसे इंतज़ार के साथ दोबारा आज़माया जाता है जो आधे सेकंड से शुरू होता है और आठ सेकंड तक दोगुना होता जाता है।
- 429 को तभी दोबारा आज़माया जाता है जब उसके साथ एक मिनट या उससे कम का
Retry-Afterहो, और क्लाइंट उतनी देर प्रतीक्षा करता है। - जो कनेक्शन विफल होता है या जिसका टाइमआउट हो जाता है उसे भी इसी तरह दोबारा आज़माया जाता है।
दोबारा आज़माई गई भेजने वाली कॉल हर बार वही आइडेम्पोटेंसी कुंजी रखती है, इसलिए API दूसरा संदेश भेजने के बजाय पहला संदेश दोहराता है।