Kalo te dokumentacioni
Ruby

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ë

rescue_errors.rb
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?  raiseend

Një 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.

rescue_by_class.rb
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}"  raiseend

Klasat

KlasaKur
OpenEmail::ErrorBaza e çdo gabimi që përcakton gem-i, ndaj rescue OpenEmail::Error i kap të gjitha. Nuk e kap ArgumentError.
OpenEmail::ApiErrorAPI-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 RateLimitErrorNë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::NetworkErrorNuk 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::WebhookSignatureErrorOpenEmail.verify_webhook_signature refuzoi një dërgesë.
ArgumentErrorNgrihet 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.
PredikatiTrue 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.