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

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

نوع خطأ واحد لكل إخفاق، وقيمة حارسة لكل نوع، وإعادة محاولات لا يمكن أن ترسل مرتين.

معالجة خطأ

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

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