Saltar para a documentação
Go

Erros e novas tentativas

Um único tipo de erro para cada falha, uma sentinela para cada género e novas tentativas que não podem enviar duas vezes.

Tratar um erro

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}

Cada falha é um *openemail.Error. errors.Is diz de que género é, e errors.As dá o próprio erro, com o que a API disse sobre ele.

CampoO que contém
StatusO estado HTTP, ou 0 quando não chegou nenhuma resposta.
Type, CodeO tipo de erro e o código da API, como validation_error e invalid_parameter.
ParamO campo responsável, quando existe.
RequestIDO id a indicar quando escrever ao suporte.
DocURLA página da documentação que explica o código.
RetryAfterQuanto tempo a API lhe pediu para esperar.
FieldsOs campos que um formulário de inscrição recusou, cada um com uma Key e um Error.
BodyO corpo da resposta, descodificado.

Os géneros de falha

SentinelaQuando corresponde
ErrAuthenticationA chave ou o token foi recusado, com um 401.
ErrPermissionA credencial não pode fazer isto, com um 403.
ErrScopeMissingFalta à credencial o âmbito de que a chamada precisa.
ErrStepUpRequiredUm token de acesso tem primeiro de verificar um código.
ErrNotFoundNada tem esse id, com um 404.
ErrConflictA alteração entra em conflito com o estado atual, com um 409.
ErrValidationUm campo foi recusado, com um 422.
ErrRateLimitedDemasiados pedidos, ou uma quota esgotou-se, com um 429.
ErrInvalidRequestQualquer outra recusa do pedido.
ErrServerA API falhou, com um estado de 500 ou superior.
ErrRetryableO estado é um dos que o cliente tenta de novo.
ErrNetworkNão chegou nenhuma resposta.
ErrTimeoutNão chegou nenhuma resposta antes do tempo limite.
ErrInvalidArgumentA própria chamada estava errada, e nada foi enviado.
ErrWebhookSignatureUma entrega de webhook falhou na sua verificação.

Um contexto cancelado continua a corresponder a context.Canceled, e um prazo ultrapassado corresponde a context.DeadlineExceeded.

O que é tentado de novo

  • As leituras, os envios e todas as escritas que é seguro repetir são tentados de novo, até WithMaxRetries vezes. Qualquer outra escrita é enviada uma só vez.
  • Os estados 408, 500, 502, 503 e 504 são tentados de novo com uma espera que começa em meio segundo e duplica até oito segundos.
  • Um 429 só é tentado de novo quando traz um Retry-After de um minuto ou menos, e o cliente espera esse tempo.
  • Uma ligação que falha ou que excede o tempo limite é tentada de novo da mesma forma.

Um envio tentado de novo leva sempre a mesma chave de idempotência, por isso a API repete a primeira mensagem em vez de enviar uma segunda.