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 | هر رد دیگرِ درخواست. |
| ErrServer | API شکست خورد، با وضعیت 500 یا بیشتر. |
| ErrRetryable | وضعیت از آنهایی است که کلاینت دوباره امتحان میکند. |
| ErrNetwork | هیچ پاسخی نرسید. |
| ErrTimeout | پیش از پایان مهلت هیچ پاسخی نرسید. |
| ErrInvalidArgument | خودِ فراخوانی نادرست بود و چیزی فرستاده نشد. |
| ErrWebhookSignature | یک تحویل وبهوک در بررسی خود رد شد. |
زمینهٔ لغوشده همچنان با context.Canceled مطابقت دارد، و سررسیدِ گذشته با context.DeadlineExceeded مطابقت دارد.
آنچه دوباره امتحان میشود
- خواندنها، ارسالها و هر نوشتنی که تکرارش بیخطر است دوباره امتحان میشوند، تا
WithMaxRetriesبار. هر نوشتن دیگری یک بار فرستاده میشود. - وضعیتهای 408، 500، 502، 503 و 504 با انتظاری دوباره امتحان میشوند که از نیم ثانیه شروع میشود و تا هشت ثانیه دو برابر میشود.
- یک 429 فقط وقتی دوباره امتحان میشود که
Retry-Afterیک دقیقه یا کمتر داشته باشد، و کلاینت همانقدر صبر میکند. - اتصالی که شکست بخورد یا مهلتش تمام شود به همین شیوه دوباره امتحان میشود.
ارسالی که دوباره امتحان میشود هر بار همان کلید یکتایی را دارد، پس API بهجای فرستادن پیام دوم، پیام نخست را بازپخش میکند.