خطاها و تلاش دوباره
یک کلاس استثنا برای هر گونه رد شدن، و تلاشهای دوبارهای که نمیتوانند دو بار بفرستند.
رسیدگی به یک خطا
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() | شناسهای که هنگام نوشتن به پشتیبانی باید ذکر کنید. |
| docUrl() | صفحهای از مستندات که کد را توضیح میدهد. |
| retryAfterSeconds() | مدتی که API از شما خواسته صبر کنید. |
| fields() | فیلدهایی که یک فرم ثبتنام رد کرده است، هر کدام با یک key و یک error. |
| body() | بدنهٔ رمزگشاییشدهٔ پاسخ. |
گونههای شکست
| استثنا | چه زمانی پرتاب میشود |
|---|---|
| AuthenticationException | کلید یا توکن رد شد، با 401. |
| PermissionException | این اعتبارنامه اجازهٔ این کار را ندارد، با 403. |
| NotFoundException | هیچ چیزی آن شناسه را ندارد، با 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 بهجای فرستادن پیام دوم، پیام نخست را بازپخش میکند.