Go
Gabimet dhe riprovimet
Një tip i vetëm gabimi për çdo dështim, një vlerë sentinel për çdo lloj dhe riprovime që nuk mund të dërgojnë dy herë.
Trajtimi i një gabimi
_, 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}Çdo dështim është një *openemail.Error. errors.Is tregon të cilit lloj është, dhe errors.As jep vetë gabimin, me atë që tha API-ja për të.
| Fusha | Çfarë mban |
|---|---|
| Status | Statusi HTTP, ose 0 kur nuk mbërriti asnjë përgjigje. |
| Type, Code | Tipi i gabimit dhe kodi i API-së, si validation_error dhe invalid_parameter. |
| Param | Fusha që e ka fajin, kur ka një të tillë. |
| RequestID | Id-ja që duhet të citoni kur i shkruani mbështetjes. |
| DocURL | Faqja e dokumentimit që shpjegon kodin. |
| RetryAfter | Sa ju kërkoi API-ja të prisni. |
| Fields | Fushat që refuzoi një formular regjistrimi, secila me një Key dhe një Error. |
| Body | Trupi i dekoduar i përgjigjes. |
Llojet e dështimit
| Vlera sentinel | Kur përputhet |
|---|---|
| ErrAuthentication | Çelësi ose tokeni u refuzua, me një 401. |
| ErrPermission | Kredenciali nuk lejohet ta bëjë këtë, me një 403. |
| ErrScopeMissing | Kredencialit i mungon scope-i që i duhet thirrjes. |
| ErrStepUpRequired | Një token aksesi duhet të verifikojë së pari një kod. |
| ErrNotFound | Asgjë nuk e ka atë id, me një 404. |
| ErrConflict | Ndryshimi bie ndesh me gjendjen aktuale, me një 409. |
| ErrValidation | Një fushë u refuzua, me një 422. |
| ErrRateLimited | Shumë kërkesa, ose një kuotë është shpenzuar, me një 429. |
| ErrInvalidRequest | Çdo refuzim tjetër i kërkesës. |
| ErrServer | API-ja dështoi, me një status 500 ose më të lartë. |
| ErrRetryable | Statusi është nga ata që klienti i riprovon. |
| ErrNetwork | Nuk mbërriti asnjë përgjigje. |
| ErrTimeout | Nuk mbërriti asnjë përgjigje para afatit kohor. |
| ErrInvalidArgument | Vetë thirrja ishte e gabuar, dhe asgjë nuk u dërgua. |
| ErrWebhookSignature | Një dorëzim webhook-u nuk e kaloi kontrollin e vet. |
Një kontekst i anuluar vazhdon të përputhet me context.Canceled, dhe një afat i kaluar përputhet me context.DeadlineExceeded.
Çfarë riprovohet
- Leximet, dërgimet dhe çdo shkrim që është i sigurt për t'u përsëritur riprovohen, deri në
WithMaxRetriesherë. Çdo shkrim tjetër dërgohet një herë. - Statuset 408, 500, 502, 503 dhe 504 riprovohen me një pritje që nis nga gjysmë sekonde dhe dyfishohet deri në tetë sekonda.
- Një 429 riprovohet vetëm kur mban një
Retry-Afterprej një minute ose më pak, dhe klienti pret aq gjatë. - Një lidhje që dështon ose që e kalon afatin kohor riprovohet në të njëjtën mënyrë.
Një dërgim që riprovohet mban çdo herë të njëjtin çelës idempotence, kështu që API-ja e përsërit mesazhin e parë në vend që të dërgojë një të dytë.