خطاها و تلاش دوباره
یک نوع استثنا برای هر رد شدن، یک ویژگی برای هر گونه، و تلاشهای دوبارهای که نمیتوانند دو بار بفرستند.
رسیدگی به یک خطا
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 یک OpenEmailApiException پرتاب میکند، و نرسیدن هیچ پاسخی یک OpenEmailNetworkException. هر دو از OpenEmailException مشتق میشوند، پس یک catch هر کدام را میگیرد، و یک فیلتر when گونه را برمیگزیند.
| ویژگی | محتوای آن |
|---|---|
| Status | وضعیت HTTP. |
| ErrorType, Code | نوع خطا و کد API، مانند validation_error و invalid_parameter. |
| Param | فیلدی که مقصر است، اگر چنین فیلدی باشد. |
| RequestId | شناسهای که هنگام نوشتن به پشتیبانی باید ذکر کنید. |
| DocUrl | صفحهای از مستندات که کد را توضیح میدهد. |
| RetryAfterSeconds | مدتی که API از شما خواسته صبر کنید، به ثانیه. |
| Fields | فیلدهایی که یک فرم ثبتنام رد کرده است، هر کدام با یک key و یک error. |
| Body | بدنهٔ رمزگشاییشدهٔ پاسخ. |
گونههای شکست
| ویژگی | چه زمانی درست است |
|---|---|
| IsAuth | کلید یا توکن رد شد، با 401. |
| IsPermission | این اعتبارنامه اجازهٔ این کار را ندارد، با 403. |
| IsScopeMissing | اعتبارنامه دامنهٔ دسترسیای را که فراخوانی لازم دارد ندارد. |
| IsStepUpRequired | توکن دسترسی باید نخست یک کد را تأیید کند. |
| IsNotFound | هیچ چیزی آن شناسه را ندارد، با 404. |
| IsConflict | تغییر با وضعیت فعلی ناسازگار است، با 409. |
| IsValidation | یک فیلد رد شد، با 422. |
| IsRateLimited | درخواستها بیش از حد است، یا یک سهمیه تمام شده، با 429. |
| IsInvalidRequest | هر رد دیگرِ درخواست. |
| IsServerError | API شکست خورد، با وضعیت 500 یا بیشتر. |
| IsRetryable | وضعیت از آنهایی است که کلاینت دوباره امتحان میکند. |
| IsTimeout | پیش از پایان مهلت هیچ پاسخی نرسید. این یکی روی OpenEmailNetworkException است. |
اشتباه در خودِ فراخوانی، مانند کلید بدشکل یا شناسهٔ خالی، پیش از فرستادن هر چیزی ArgumentException پرتاب میکند. توکنِ لغوشده OperationCanceledException پرتاب میکند، و تحویل وبهوکی که در بررسی رد شود OpenEmailWebhookException پرتاب میکند.
کد تأیید
توکن دسترسی بهجای یک شخص عمل میکند، پس پیش از یک تغییر حساس، مانند حذف یک دامنه، همان کد تأییدی از آن خواسته میشود که برنامهٔ وب میخواهد. یک کد درخواست کنید، آن را بررسی کنید، سپس درخواست را دوباره بفرستید. از کلیدهای API هرگز کدی خواسته نمیشود.
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);}آنچه دوباره امتحان میشود
- خواندنها، ارسالها و هر نوشتنی که تکرارش بیخطر است دوباره امتحان میشوند، تا
MaxRetriesبار. هر نوشتن دیگری یک بار فرستاده میشود. - وضعیتهای 408، 500، 502، 503 و 504 با انتظاری دوباره امتحان میشوند که از نیم ثانیه شروع میشود و تا هشت ثانیه دو برابر میشود.
- یک 429 فقط وقتی دوباره امتحان میشود که
Retry-Afterیک دقیقه یا کمتر داشته باشد، و کلاینت همانقدر صبر میکند. - اتصالی که شکست بخورد یا مهلتش تمام شود به همین شیوه دوباره امتحان میشود.
ارسالی که دوباره امتحان میشود هر بار همان کلید یکتایی را دارد، پس API بهجای فرستادن پیام دوم، پیام نخست را بازپخش میکند.