پرش به مستندات
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 خود خطا را می‌دهد، همراه با آنچه API درباره‌اش گفته است.

فیلدمحتوای آن
Statusوضعیت HTTP، یا 0 وقتی هیچ پاسخی نرسیده است.
Type, Codeنوع خطا و کد API، مانند validation_error و invalid_parameter.
Paramفیلدی که مقصر است، اگر چنین فیلدی باشد.
RequestIDشناسه‌ای که هنگام نوشتن به پشتیبانی باید ذکر کنید.
DocURLصفحه‌ای از مستندات که کد را توضیح می‌دهد.
RetryAfterمدتی که API از شما خواسته صبر کنید.
Fieldsفیلدهایی که یک فرم ثبت‌نام رد کرده است، هر کدام با یک Key و یک Error.
Bodyبدنهٔ رمزگشایی‌شدهٔ پاسخ.

گونه‌های شکست

مقدار نگهبانچه زمانی مطابقت دارد
ErrAuthenticationکلید یا توکن رد شد، با 401.
ErrPermissionاین اعتبارنامه اجازهٔ این کار را ندارد، با 403.
ErrScopeMissingاعتبارنامه دامنهٔ دسترسی‌ای را که فراخوانی لازم دارد ندارد.
ErrStepUpRequiredتوکن دسترسی باید نخست یک کد را تأیید کند.
ErrNotFoundهیچ چیزی آن شناسه را ندارد، با 404.
ErrConflictتغییر با وضعیت فعلی ناسازگار است، با 409.
ErrValidationیک فیلد رد شد، با 422.
ErrRateLimitedدرخواست‌ها بیش از حد است، یا یک سهمیه تمام شده، با 429.
ErrInvalidRequestهر رد دیگرِ درخواست.
ErrServerAPI شکست خورد، با وضعیت 500 یا بیشتر.
ErrRetryableوضعیت از آن‌هایی است که کلاینت دوباره امتحان می‌کند.
ErrNetworkهیچ پاسخی نرسید.
ErrTimeoutپیش از پایان مهلت هیچ پاسخی نرسید.
ErrInvalidArgumentخودِ فراخوانی نادرست بود و چیزی فرستاده نشد.
ErrWebhookSignatureیک تحویل وب‌هوک در بررسی خود رد شد.

زمینهٔ لغوشده همچنان با context.Canceled مطابقت دارد، و سررسیدِ گذشته با context.DeadlineExceeded مطابقت دارد.

آنچه دوباره امتحان می‌شود

  • خواندن‌ها، ارسال‌ها و هر نوشتنی که تکرارش بی‌خطر است دوباره امتحان می‌شوند، تا WithMaxRetries بار. هر نوشتن دیگری یک بار فرستاده می‌شود.
  • وضعیت‌های 408، 500، 502، 503 و 504 با انتظاری دوباره امتحان می‌شوند که از نیم ثانیه شروع می‌شود و تا هشت ثانیه دو برابر می‌شود.
  • یک 429 فقط وقتی دوباره امتحان می‌شود که Retry-After یک دقیقه یا کمتر داشته باشد، و کلاینت همان‌قدر صبر می‌کند.
  • اتصالی که شکست بخورد یا مهلتش تمام شود به همین شیوه دوباره امتحان می‌شود.

ارسالی که دوباره امتحان می‌شود هر بار همان کلید یکتایی را دارد، پس API به‌جای فرستادن پیام دوم، پیام نخست را بازپخش می‌کند.