Go
الأخطاء وإعادة المحاولة
نوع خطأ واحد لكل إخفاق، وقيمة حارسة لكل نوع، وإعادة محاولات لا يمكن أن ترسل مرتين.
معالجة خطأ
_, err := client.Emails.Send(ctx, openemail.Body{ "from": "[email protected]", "to": "[email protected]", "subject": "Your September invoice", "text": "Invoice attached.",}) var failure *openemail.Error switch {case err == nil: fmt.Println("sent")case errors.Is(err, openemail.ErrValidation): errors.As(err, &failure) fmt.Println(failure.Code, failure.Param, failure.Message)case errors.Is(err, openemail.ErrRateLimited): errors.As(err, &failure) fmt.Println("try again in", failure.RetryAfter)case errors.Is(err, openemail.ErrTimeout): fmt.Println("no answer in time")default: return err}كل إخفاق هو *openemail.Error. تخبرك errors.Is بنوعه، وتعطيك errors.As الخطأ نفسه مع ما قالته الواجهة البرمجية عنه.
| الحقل | ما يحتويه |
|---|---|
| Status | حالة HTTP، أو 0 حين لا تصل أي استجابة. |
| Type, Code | نوع الخطأ ورمزه في الواجهة البرمجية، مثل validation_error وinvalid_parameter. |
| Param | الحقل المسؤول عن الخطأ، إن وُجد. |
| RequestID | المعرّف الذي تذكره حين تراسل الدعم. |
| DocURL | صفحة التوثيق التي تشرح الرمز. |
| RetryAfter | المدة التي طلبت منك الواجهة البرمجية انتظارها. |
| Fields | الحقول التي رفضها نموذج تسجيل، ولكل منها Key وError. |
| Body | جسم الاستجابة بعد فك ترميزه. |
أنواع الإخفاق
| القيمة الحارسة | متى تطابق |
|---|---|
| ErrAuthentication | رُفض المفتاح أو الرمز، مع 401. |
| ErrPermission | بيانات الاعتماد لا يُسمح لها بهذا، مع 403. |
| ErrScopeMissing | بيانات الاعتماد ينقصها النطاق الذي يحتاجه الاستدعاء. |
| ErrStepUpRequired | يجب أن يتحقق رمز الوصول من رمز تأكيد أولًا. |
| ErrNotFound | لا شيء يحمل ذلك المعرّف، مع 404. |
| ErrConflict | التغيير يتعارض مع الحالة الحالية، مع 409. |
| ErrValidation | رُفض حقل، مع 422. |
| ErrRateLimited | طلبات كثيرة جدًا، أو استُنفدت حصة، مع 429. |
| ErrInvalidRequest | أي رفض آخر للطلب. |
| ErrServer | فشلت الواجهة البرمجية، بحالة 500 أو أكثر. |
| ErrRetryable | الحالة من الحالات التي يعيد العميل محاولتها. |
| ErrNetwork | لم تصل أي استجابة. |
| ErrTimeout | لم تصل أي استجابة قبل انتهاء المهلة. |
| ErrInvalidArgument | الاستدعاء نفسه كان خاطئًا، ولم يُرسل شيء. |
| ErrWebhookSignature | تسليم ويب هوك لم يجتز فحصه. |
السياق الملغى ما زال يطابق context.Canceled، والموعد النهائي الذي انقضى يطابق context.DeadlineExceeded.
ما يُعاد تنفيذه
- عمليات القراءة والإرسال وكل كتابة يمكن تكرارها بأمان تُعاد محاولتها، حتى
WithMaxRetriesمرة. وأي كتابة أخرى تُرسل مرة واحدة. - الحالات 408 و500 و502 و503 و504 تُعاد محاولتها مع انتظار يبدأ بنصف ثانية ويتضاعف حتى ثماني ثوانٍ.
- لا تُعاد محاولة 429 إلا حين يحمل
Retry-Afterبدقيقة أو أقل، وينتظر العميل تلك المدة. - الاتصال الذي يفشل أو تنتهي مهلته تُعاد محاولته بالطريقة نفسها.
الإرسال الذي تُعاد محاولته يحمل مفتاح عدم التكرار نفسه في كل مرة، فتعيد الواجهة البرمجية الرسالة الأولى بدل إرسال ثانية.