Go
Hatalar ve yeniden denemeler
Her başarısızlık için tek bir hata türü, her tür için bir nöbetçi değer ve iki kez gönderemeyen yeniden denemeler.
Bir hatayı ele alma
_, 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}Her başarısızlık bir *openemail.Error değeridir. errors.Is hangi türden olduğunu söyler, errors.As ise API'nin onun hakkında söyledikleriyle birlikte hatanın kendisini verir.
| Alan | Ne tutar |
|---|---|
| Status | HTTP durumu ya da hiç yanıt gelmediğinde 0. |
| Type, Code | API'nin hata türü ve kodu; örneğin validation_error ve invalid_parameter. |
| Param | Varsa, soruna yol açan alan. |
| RequestID | Desteğe yazarken belirteceğiniz kimlik. |
| DocURL | Kodu açıklayan belge sayfası. |
| RetryAfter | API'nin ne kadar beklemenizi istediği. |
| Fields | Bir kayıt formunun reddettiği alanlar; her birinin bir Key ve bir Error değeri vardır. |
| Body | Çözülmüş yanıt gövdesi. |
Başarısızlık türleri
| Nöbetçi değer | Ne zaman eşleşir |
|---|---|
| ErrAuthentication | Anahtar ya da belirteç reddedildi, 401 ile. |
| ErrPermission | Kimlik bilgisinin bunu yapmaya izni yok, 403 ile. |
| ErrScopeMissing | Kimlik bilgisinde çağrının gerektirdiği kapsam eksik. |
| ErrStepUpRequired | Bir erişim belirtecinin önce bir kodu doğrulaması gerekiyor. |
| ErrNotFound | Bu kimliğe sahip hiçbir şey yok, 404 ile. |
| ErrConflict | Değişiklik mevcut durumla çakışıyor, 409 ile. |
| ErrValidation | Bir alan reddedildi, 422 ile. |
| ErrRateLimited | Çok fazla istek var ya da bir kota tükendi, 429 ile. |
| ErrInvalidRequest | İsteğin diğer tüm retleri. |
| ErrServer | API başarısız oldu, 500 ya da üzeri bir durumla. |
| ErrRetryable | Durum, istemcinin yeniden denediklerinden biri. |
| ErrNetwork | Hiç yanıt gelmedi. |
| ErrTimeout | Zaman aşımından önce hiçbir yanıt gelmedi. |
| ErrInvalidArgument | Çağrının kendisi yanlıştı ve hiçbir şey gönderilmedi. |
| ErrWebhookSignature | Bir webhook teslimatı denetimini geçemedi. |
İptal edilmiş bir bağlam yine context.Canceled ile eşleşir, süresi dolmuş bir son tarih ise context.DeadlineExceeded ile eşleşir.
Neler yeniden denenir
- Okumalar, gönderimler ve yinelenmesi güvenli olan her yazma, en çok
WithMaxRetrieskez yeniden denenir. Diğer her yazma bir kez gönderilir. - 408, 500, 502, 503 ve 504 durumları, yarım saniyeden başlayıp sekiz saniyeye kadar ikiye katlanan bir beklemeyle yeniden denenir.
- Bir 429 yalnızca bir dakika ya da daha kısa bir
Retry-Aftertaşıdığında yeniden denenir ve istemci o kadar bekler. - Başarısız olan ya da zaman aşımına uğrayan bir bağlantı aynı şekilde yeniden denenir.
Yeniden denenen bir gönderim her seferinde aynı idempotency anahtarını taşır, böylece API ikinci bir ileti göndermek yerine ilk iletiyi yineler.