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
_, 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.
| Campo | O que contém |
|---|---|
| Status | O estado HTTP, ou 0 quando não chegou nenhuma resposta. |
| Type, Code | O tipo de erro e o código da API, como validation_error e invalid_parameter. |
| Param | O campo responsável, quando existe. |
| RequestID | O id a indicar quando escrever ao suporte. |
| DocURL | A página da documentação que explica o código. |
| RetryAfter | Quanto tempo a API lhe pediu para esperar. |
| Fields | Os campos que um formulário de inscrição recusou, cada um com uma Key e um Error. |
| Body | O corpo da resposta, descodificado. |
Os géneros de falha
| Sentinela | Quando corresponde |
|---|---|
| ErrAuthentication | A chave ou o token foi recusado, com um 401. |
| ErrPermission | A credencial não pode fazer isto, com um 403. |
| ErrScopeMissing | Falta à credencial o âmbito de que a chamada precisa. |
| ErrStepUpRequired | Um token de acesso tem primeiro de verificar um código. |
| ErrNotFound | Nada tem esse id, com um 404. |
| ErrConflict | A alteração entra em conflito com o estado atual, com um 409. |
| ErrValidation | Um campo foi recusado, com um 422. |
| ErrRateLimited | Demasiados pedidos, ou uma quota esgotou-se, com um 429. |
| ErrInvalidRequest | Qualquer outra recusa do pedido. |
| ErrServer | A API falhou, com um estado de 500 ou superior. |
| ErrRetryable | O estado é um dos que o cliente tenta de novo. |
| ErrNetwork | Não chegou nenhuma resposta. |
| ErrTimeout | Não chegou nenhuma resposta antes do tempo limite. |
| ErrInvalidArgument | A própria chamada estava errada, e nada foi enviado. |
| ErrWebhookSignature | Uma 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é
WithMaxRetriesvezes. 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-Afterde 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.