تخطَّ إلى المستندات
C#

الأخطاء وإعادة المحاولة

نوع استثناء واحد لكل رفض، وخاصية لكل نوع، وإعادة محاولات لا يمكن أن ترسل مرتين.

معالجة خطأ

errors.cs
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 فلا يُطلب منها رمز أبدًا.

step-up.cs
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 بدقيقة أو أقل، وينتظر العميل تلك المدة.
  • الاتصال الذي يفشل أو تنتهي مهلته تُعاد محاولته بالطريقة نفسها.

الإرسال الذي تُعاد محاولته يحمل مفتاح عدم التكرار نفسه في كل مرة، فتعيد الواجهة البرمجية الرسالة الأولى بدل إرسال ثانية.