Zur Dokumentation springen
Go

Fehler und Wiederholungen

Ein Fehlertyp für jeden Fehlschlag, ein Sentinel für jede Art und Wiederholungen, die nicht doppelt senden können.

Einen Fehler behandeln

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}

Jeder Fehlschlag ist ein *openemail.Error. errors.Is sagt, welcher Art er ist, und errors.As liefert den Fehler selbst mit dem, was die API dazu gesagt hat.

FeldWas sie enthält
StatusDer HTTP-Status, oder 0, wenn keine Antwort eintraf.
Type, CodeDer Fehlertyp und der Code der API, etwa validation_error und invalid_parameter.
ParamDas Feld, das schuld ist, wenn es eines gibt.
RequestIDDie ID, die Sie nennen, wenn Sie dem Support schreiben.
DocURLDie Seite der Dokumentation, die den Code erklärt.
RetryAfterWie lange Sie laut API warten sollen.
FieldsDie Felder, die ein Anmeldeformular abgelehnt hat, jeweils mit Key und Error.
BodyDer dekodierte Antwortkörper.

Die Arten von Fehlschlägen

SentinelWann er zutrifft
ErrAuthenticationDer Schlüssel oder das Token wurde abgelehnt, mit einem 401.
ErrPermissionDie Zugangsdaten dürfen das nicht, mit einem 403.
ErrScopeMissingDen Zugangsdaten fehlt der Scope, den der Aufruf braucht.
ErrStepUpRequiredEin Zugriffstoken muss zuerst einen Code bestätigen.
ErrNotFoundNichts hat diese ID, mit einem 404.
ErrConflictDie Änderung widerspricht dem aktuellen Zustand, mit einem 409.
ErrValidationEin Feld wurde abgelehnt, mit einem 422.
ErrRateLimitedZu viele Anfragen oder ein Kontingent ist aufgebraucht, mit einem 429.
ErrInvalidRequestJede andere Ablehnung der Anfrage.
ErrServerDie API ist fehlgeschlagen, mit einem Status von 500 oder höher.
ErrRetryableDer Status gehört zu denen, die der Client erneut versucht.
ErrNetworkEs traf keine Antwort ein.
ErrTimeoutVor Ablauf des Zeitlimits kam keine Antwort.
ErrInvalidArgumentDer Aufruf selbst war falsch, und nichts wurde gesendet.
ErrWebhookSignatureEine Webhook-Zustellung hat ihre Prüfung nicht bestanden.

Ein abgebrochener Kontext entspricht weiterhin context.Canceled, und eine abgelaufene Frist entspricht context.DeadlineExceeded.

Was erneut versucht wird

  • Lesezugriffe, Sendungen und jeder Schreibzugriff, der gefahrlos wiederholt werden kann, werden bis zu WithMaxRetries Mal erneut versucht. Jeder andere Schreibzugriff wird einmal gesendet.
  • Die Status 408, 500, 502, 503 und 504 werden mit einer Wartezeit wiederholt, die bei einer halben Sekunde beginnt und sich bis auf acht Sekunden verdoppelt.
  • Ein 429 wird nur wiederholt, wenn er ein Retry-After von höchstens einer Minute trägt, und der Client wartet so lange.
  • Eine Verbindung, die scheitert oder das Zeitlimit überschreitet, wird genauso wiederholt.

Ein wiederholter Versand trägt jedes Mal denselben Idempotenzschlüssel, sodass die API die erste Nachricht erneut ausgibt, statt eine zweite zu senden.