Belgelere geç
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

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}

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.

AlanNe tutar
StatusHTTP durumu ya da hiç yanıt gelmediğinde 0.
Type, CodeAPI'nin hata türü ve kodu; örneğin validation_error ve invalid_parameter.
ParamVarsa, soruna yol açan alan.
RequestIDDesteğe yazarken belirteceğiniz kimlik.
DocURLKodu açıklayan belge sayfası.
RetryAfterAPI'nin ne kadar beklemenizi istediği.
FieldsBir 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ğerNe zaman eşleşir
ErrAuthenticationAnahtar ya da belirteç reddedildi, 401 ile.
ErrPermissionKimlik bilgisinin bunu yapmaya izni yok, 403 ile.
ErrScopeMissingKimlik bilgisinde çağrının gerektirdiği kapsam eksik.
ErrStepUpRequiredBir erişim belirtecinin önce bir kodu doğrulaması gerekiyor.
ErrNotFoundBu kimliğe sahip hiçbir şey yok, 404 ile.
ErrConflictDeğişiklik mevcut durumla çakışıyor, 409 ile.
ErrValidationBir 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.
ErrServerAPI başarısız oldu, 500 ya da üzeri bir durumla.
ErrRetryableDurum, istemcinin yeniden denediklerinden biri.
ErrNetworkHiç yanıt gelmedi.
ErrTimeoutZaman aşımından önce hiçbir yanıt gelmedi.
ErrInvalidArgumentÇağrının kendisi yanlıştı ve hiçbir şey gönderilmedi.
ErrWebhookSignatureBir 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 WithMaxRetries kez 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-After taşı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.