Перейти к документации
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.

ПолеЧто в нём
StatusHTTP-статус или 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 воспроизводит первое сообщение, а не отправляет второе.