الأخطاء وإعادة المحاولة
نوع استثناء واحد لكل رفض، وخاصية لكل نوع، وإعادة محاولات لا يمكن أن ترسل مرتين.
معالجة خطأ
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");}الرفض من الواجهة البرمجية يرمي OpenEmailApiException، وغياب أي استجابة يرمي OpenEmailNetworkException. كلاهما مشتق من OpenEmailException، فتلتقط catch واحدة أيًّا منهما، ويختار مرشح when النوع.
| الخاصية | ما يحتويه |
|---|---|
| Status | حالة HTTP. |
| ErrorType, Code | نوع الخطأ ورمزه في الواجهة البرمجية، مثل validation_error وinvalid_parameter. |
| Param | الحقل المسؤول عن الخطأ، إن وُجد. |
| RequestId | المعرّف الذي تذكره حين تراسل الدعم. |
| DocUrl | صفحة التوثيق التي تشرح الرمز. |
| RetryAfterSeconds | المدة التي طلبت منك الواجهة البرمجية انتظارها، بالثواني. |
| Fields | الحقول التي رفضها نموذج تسجيل، ولكل منها key وerror. |
| Body | جسم الاستجابة بعد فك ترميزه. |
أنواع الإخفاق
| الخاصية | متى تكون صحيحة |
|---|---|
| IsAuth | رُفض المفتاح أو الرمز، مع 401. |
| IsPermission | بيانات الاعتماد لا يُسمح لها بهذا، مع 403. |
| IsScopeMissing | بيانات الاعتماد ينقصها النطاق الذي يحتاجه الاستدعاء. |
| IsStepUpRequired | يجب أن يتحقق رمز الوصول من رمز تأكيد أولًا. |
| IsNotFound | لا شيء يحمل ذلك المعرّف، مع 404. |
| IsConflict | التغيير يتعارض مع الحالة الحالية، مع 409. |
| IsValidation | رُفض حقل، مع 422. |
| IsRateLimited | طلبات كثيرة جدًا، أو استُنفدت حصة، مع 429. |
| IsInvalidRequest | أي رفض آخر للطلب. |
| IsServerError | فشلت الواجهة البرمجية، بحالة 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بدقيقة أو أقل، وينتظر العميل تلك المدة. - الاتصال الذي يفشل أو تنتهي مهلته تُعاد محاولته بالطريقة نفسها.
الإرسال الذي تُعاد محاولته يحمل مفتاح عدم التكرار نفسه في كل مرة، فتعيد الواجهة البرمجية الرسالة الأولى بدل إرسال ثانية.