Gabimet
Çdo dështim ngre gabim. Një klasë për refuzimin, një për mungesën e përgjigjes dhe një id kërkese në çdo gabim të API-së.
Si ta kapni një
message = {from: "[email protected]", to: "[email protected]", subject: "Your September invoice", text: "Invoice attached."} begin client.emails.send(message)rescue OpenEmail::ApiError => error warn "#{error.code} #{error.param} #{error.message}" if error.validation? warn client.addresses.list_all.addresses.inspect if error.permission? warn "try again in #{error.retry_after_seconds} seconds" if error.rate_limited? warn "#{error.status} #{error.request_id}" raiserescue OpenEmail::NetworkError => error warn "no answer in time" if error.timeout? raiseendNjë permission_error gjatë dërgimit zakonisht lidhet me fushën e dërgimit të ÇELËSIT, pra me një domen ose një adresë që nuk iu dha, dhe jo me hapësirën e punës; prandaj shembulli printon atë që thotë addresses.list_all për adresat me të cilat mund të dërgojë ky çelës.
Çdo lloj refuzimi ka nënklasën e vet, ndaj një rescue mund të zgjedhë sipas klasës ato që trajton dhe t’i lërë të tjerat të ngjiten më lart.
message = {from: "[email protected]", to: "[email protected]", subject: "Your September invoice", text: "Invoice attached."} begin client.emails.send(message)rescue OpenEmail::ValidationError => error warn "#{error.param}: #{error.message}"rescue OpenEmail::AuthenticationError, OpenEmail::PermissionError => error warn "the key cannot do this: #{error.code}" raiserescue OpenEmail::Error => error warn "#{error.class}: #{error.message}" raiseendKlasat
| Klasa | Kur |
|---|---|
| OpenEmail::Error | Baza e çdo gabimi që përcakton gem-i, ndaj rescue OpenEmail::Error i kap të gjitha. Nuk e kap ArgumentError. |
| OpenEmail::ApiError | API-ja u përgjigj, por jo me sukses. Mbart status, type, code, param, doc_url, request_id, retry_after_seconds, fields dhe body. Ngrihet si vetvetja kur type është api_error, siç ndodh me një defekt të serverit, dhe si nënklasa për type e tij në rastet e tjera. |
| OpenEmail::InvalidRequestError, AuthenticationError, PermissionError, NotFoundError, ConflictError, ValidationError dhe RateLimitError | Nënklasa të ApiError, një për çdo type: invalid_request_error, authentication_error, permission_error, not_found_error, conflict_error, validation_error dhe rate_limit_error. |
| OpenEmail::NetworkError | Nuk mbërriti asnjë përgjigje: DNS, TLS, një lidhje e refuzuar ose e këputur, ose skadimi i afatit. Mbart original, përjashtimin poshtë tij, që është edhe cause i tij, dhe timeout? është true kur arsyeja ishte skadimi i afatit. |
| OpenEmail::WebhookSignatureError | OpenEmail.verify_webhook_signature refuzoi një dërgesë. |
| ArgumentError | Ngrihet para se të dërgohet çfarëdo: një çelës që mungon ose është i keqformuar, një base_url: i papërdorshëm, një id bosh. Është klasa e thjeshtë e Ruby-t, jo një OpenEmail::Error, sepse do të thotë se vetë thirrja është e gabuar. |
Çfarë mbart një ApiError
messageString- Fjalia e vetë API-së, e shkruar për një njeri dhe që përmend vlerën problematike kur ka të tillë. Nuk është identifikues i qëndrueshëm, ndaj degëzojeni sipas `code`.
statusInteger- Statusi HTTP i përgjigjes.
typeString- Një nga tetë vlerat në `OpenEmail::ERROR_TYPES`, një bashkësi e ngrirë që nuk do të rritet. Kur trupi nuk përmend asnjë, nxirret nga statusi.
codeString- Dështimi specifik, si `from_address_forbidden` ose `invalid_email_address`. Bashkësi e hapur që zgjerohet, ndaj një kod që nuk e njihni trajtojeni sipas `type` të tij. Është `unrecognised_response` kur trupi nuk ishte zarfi i gabimit të API-së.
paramString or nil- Fusha që u refuzua, si shteg me pika, p.sh. `to.0`, kur dështimi përmend një të tillë.
doc_urlString or nil- Një faqe për këtë dështim, kur API-ja përmend një të tillë.
request_idString or nil- Id-ja me të cilën serveri e regjistroi kërkesën në log, nga trupi ose nga header-i `x-request-id`.
retry_after_secondsInteger, Float or nil- Pritja që kërkoi serveri në `Retry-After`, në sekonda, qoftë kur dërgoi një numër, qoftë një datë. nil kur nuk dërgoi asnjë.
fieldsArray<Hash> or nil- Një Hash për çdo problem, secili me `key` dhe `error`, si `{key: "email", error: "email"}` kur `forms.subscribe` i refuzoi përgjigjet me një 422 `invalid_form_submission`. nil kur gabimi nuk rendit asnjë.
bodyHash or nil- E gjithë përgjigjja e gabimit, e analizuar, me çelësa Symbol. nil kur ishte bosh ose nuk ishte JSON.
| Predikati | True kur |
|---|---|
| auth? | type është authentication_error, një 401: asnjë çelës, lloji i gabuar i kredencialit, ose një çelës që nuk e kemi lëshuar ne. |
| permission? | permission_error, një 403: një çelës i vërtetë pa scope-in ose pa adresën From që i duhet. |
| scope_missing? | code është insufficient_scope, 403-shi që emërton një scope që mungon. |
| invalid_request? | invalid_request_error, një 400: një kërkesë që nuk u kuptua. Një mesazh mbi kufirin e madhësisë kthehet si një 422 message_too_large, ndaj predikati që e kap është validation?. |
| validation? | validation_error, një 422: skema e refuzoi, dhe param e emërton fushën. |
| not_found? | not_found_error, një 404: nuk ka burim të tillë. |
| conflict? | conflict_error, një 409: burimi ka kaluar pikën ku kjo mund t'i bëhej. |
| rate_limited? | rate_limit_error, një 429. retry_after_seconds mban pritjen kur serveri ka përmendur një të tillë. |
| server_error? | status është 500 ose më i lartë. Përmendni request_id nëse kontaktoni mbështetjen. |
| retryable? | status është 408, 429, 500, 502, 503 ose 504. |
| step_up_required? | code është step_up_required, 403-shi që merr një token qasjeje OAuth para një ndryshimi të ndjeshëm derisa personi të ketë verifikuar një kod. |
Shumica e predikateve lexojnë type, gjysmën e ngrirë të zarfit, dhe çdo nënklasë përfaqëson një type. code mbetet String, sepse API-ja garanton se është bashkësi e hapur që zgjerohet, ndaj një kod që nuk e njihni trajtojeni sipas type të tij. Një listë e mbyllur do ta bënte përditësimin e gem-it çmimin për të lexuar një lloj të ri dështimi.
Një trup që nuk është zarfi i gabimit të API-së ngre prapëseprapë një OpenEmail::ApiError, me type të nxjerrë nga statusi dhe code të barabartë me unrecognised_response. E ngre gjithashtu edhe një përgjigje e suksesshme trupi i së cilës nuk është JSON.
retryable? përshkruan statusin, jo thirrjen tuaj. Një thirrje që mund të përsëritet pa rrezik është riprovuar tashmë kur ngre gabim, dhe një 429 si send_quota_exceeded ose ai_quota_exceeded dështon në të njëjtën mënyrë derisa të rivendoset kuota e tij, ndaj tregojani një njeriu në vend që ta përsërisni në cikël.
Një përjashtim që ngre adapteri juaj bëhet një OpenEmail::NetworkError pasi të jenë shteruar riprovat që lejon thirrja, me origjinalin te original dhe cause. NameError, TypeError dhe ArgumentError janë përjashtimet nga ky rregull: ato nënkuptojnë një defekt në adapter, ndaj ngrihen të pandryshuara dhe nuk riprovohen kurrë.
request_id
Çdo OpenEmail::ApiError mbart id-në e kërkesës që dërgoi serveri, nga trupi i gabimit ose nga header-i x-request-id, dhe kjo është e vetmja gjë që e lidh dështimin tuaj me një rresht në log-un e serverit. Një sukses kthen vetëm trupin e analizuar, ndaj në të nuk ka id kërkese për të lexuar.