Hatalar
Her başarısızlık hata fırlatır. Ret için bir sınıf, yanıt gelmemesi için bir sınıf ve her API hatasında bir istek kimliği.
Hata yakalama
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? raiseendBir gönderimdeki permission_error genellikle çalışma alanından değil ANAHTARIN gönderim kapsamından, yani kendisine verilmemiş bir alan adından veya adresten kaynaklanır. Örnek kodun, bu anahtarın hangi adresler adına gönderebileceğine dair addresses.list_all çağrısının söylediklerini yazdırmasının nedeni budur.
Her ret türünün kendine ait bir alt sınıfı vardır; böylece bir rescue, ele aldıklarını sınıfa göre seçip geri kalanların yukarı doğru ilerlemesine izin verebilir.
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}" raiseendSınıflar
| Sınıf | Ne zaman |
|---|---|
| OpenEmail::Error | Gem'in tanımladığı her hatanın temel sınıfıdır; bu yüzden rescue OpenEmail::Error hepsini yakalar. ArgumentError hatasını yakalamaz. |
| OpenEmail::ApiError | API yanıt verdi, ama başarıyla değil. status, type, code, param, doc_url, request_id, retry_after_seconds, fields ve body taşır. type değeri api_error olduğunda (bir sunucu arızasında olduğu gibi) kendisi olarak, aksi hâlde type değerine karşılık gelen alt sınıf olarak fırlatılır. |
| OpenEmail::InvalidRequestError, AuthenticationError, PermissionError, NotFoundError, ConflictError, ValidationError ve RateLimitError | Her type için bir tane olmak üzere ApiError alt sınıfları: invalid_request_error, authentication_error, permission_error, not_found_error, conflict_error, validation_error ve rate_limit_error. |
| OpenEmail::NetworkError | Hiç yanıt gelmedi: DNS, TLS, reddedilen ya da kopan bir bağlantı veya zaman aşımı. Alttaki istisna olan ve aynı zamanda cause değeri de olan original taşır; neden zaman aşımıysa timeout? true olur. |
| OpenEmail::WebhookSignatureError | OpenEmail.verify_webhook_signature bir teslimi reddetti. |
| ArgumentError | Hiçbir şey gönderilmeden önce fırlatılır: eksik ya da hatalı biçimlendirilmiş bir anahtar, kullanılamaz bir base_url:, boş bir kimlik. Bir OpenEmail::Error değil, sıradan Ruby sınıfıdır, çünkü çağrının kendisinin yanlış olduğu anlamına gelir. |
Bir ApiError'ın taşıdıkları
messageString- API'nin bir insan için yazdığı ve varsa soruna yol açan değeri adlandıran kendi cümlesi. Kararlı bir tanımlayıcı değildir, bu yüzden dallanmayı `code` üzerinden yapın.
statusInteger- Yanıtın HTTP durumu.
typeString- `OpenEmail::ERROR_TYPES` içindeki sekiz değerden biri; bu küme dondurulmuştur ve büyümeyecektir. Gövde bir değer belirtmediğinde durumdan çıkarılır.
codeString- `from_address_forbidden` ya da `invalid_email_address` gibi belirli hata. Açık ve genişletilebilir bir kümedir, bu yüzden tanımadığınız bir kodu `type` değerine göre ele alın. Gövde API'nin hata zarfı olmadığında `unrecognised_response` olur.
paramString or nil- Hata bir alan belirttiğinde, `to.0` gibi noktalı bir yol olarak reddedilen alan.
doc_urlString or nil- API bir sayfa belirttiğinde, bu hatayla ilgili sayfa.
request_idString or nil- Sunucunun isteği günlüğe kaydettiği kimlik; gövdeden ya da `x-request-id` başlığından alınır.
retry_after_secondsInteger, Float or nil- Sunucunun `Retry-After` içinde istediği bekleme süresi, saniye cinsinden; sunucu ister bir sayı ister bir tarih göndermiş olsun. Hiçbir şey göndermediyse nil.
fieldsArray<Hash> or nil- Her sorun için `key` ve `error` içeren bir Hash; örneğin `forms.subscribe` yanıtları 422 `invalid_form_submission` ile reddettiğinde `{key: "email", error: "email"}`. Hata hiçbir sorun listelemiyorsa nil.
bodyHash or nil- Hata yanıtının tamamı, ayrıştırılmış ve Symbol anahtarlı olarak. Boşsa ya da JSON değilse nil.
| Yüklem | Şu durumda true |
|---|---|
| auth? | type değeri authentication_error, yani 401: anahtar yok, yanlış türde bir kimlik bilgisi veya bizim vermediğimiz bir anahtar. |
| permission? | permission_error, 403: ihtiyaç duyduğu kapsama veya From adresine sahip olmayan gerçek bir anahtar. |
| scope_missing? | code değeri insufficient_scope, yani eksik kapsamı adıyla belirten 403. |
| invalid_request? | invalid_request_error, 400: anlaşılamayan bir istek. Boyut sınırını aşan bir ileti 422 message_too_large olarak döner; bu yüzden onu yakalayan yüklem validation? metodudur. |
| validation? | validation_error, 422: şema isteği reddetti ve param hangi alanın sorunlu olduğunu belirtir. |
| not_found? | not_found_error, 404: böyle bir kaynak yok. |
| conflict? | conflict_error, 409: kaynak, bu işlemin kendisine yapılabileceği noktayı geçmiş. |
| rate_limited? | rate_limit_error, 429. Sunucu bir bekleme süresi belirttiyse retry_after_seconds bunu tutar. |
| server_error? | status 500 veya üzeridir. Destekle iletişime geçerseniz request_id değerini belirtin. |
| retryable? | status 408, 429, 500, 502, 503 veya 504. |
| step_up_required? | code değeri step_up_required'dır: bir OAuth erişim tokenının, kişi bir kodu doğrulayana kadar hassas bir değişiklikten önce aldığı 403. |
Yüklemlerin çoğu, zarfın dondurulmuş yarısı olan type değerini okur ve her alt sınıf bir type değerine karşılık gelir. code bir String olarak kalır, çünkü API onun açık ve genişletilebilir olduğunu garanti eder; bu yüzden tanımadığınız bir kodu type değerine göre ele alın. Kapalı bir liste, yeni bir hata türünü okuyabilmeyi bir gem yükseltmesine bağlardı.
API'nin hata zarfı olmayan bir gövde de, type değeri durumdan çıkarılmış ve code değeri unrecognised_response olarak ayarlanmış bir OpenEmail::ApiError fırlatır. Gövdesi JSON olmayan başarılı bir yanıt da aynı hatayı fırlatır.
retryable? çağrınızı değil, durumu tanımlar. Tekrarlanması güvenli bir çağrı, hata fırlattığı anda zaten yeniden denenmiştir; send_quota_exceeded ya da ai_quota_exceeded gibi bir 429 ise kotası sıfırlanana kadar aynı şekilde başarısız olur. Bu yüzden onu bir döngüde tekrarlamak yerine bir kişiye gösterin.
Adaptörünüzün fırlattığı bir istisna, çağrının izin verdiği yeniden denemeler tükendiğinde, asıl istisna original ve cause üzerinde olacak şekilde bir OpenEmail::NetworkError hâline gelir. NameError, TypeError ve ArgumentError bunun istisnalarıdır: adaptörde bir hata olduğu anlamına gelirler, bu yüzden değiştirilmeden fırlatılırlar ve asla yeniden denenmezler.
request_id
Her OpenEmail::ApiError, sunucunun gönderdiği istek kimliğini hata gövdesinden ya da x-request-id başlığından alarak taşır ve hatanızı sunucu günlüğündeki bir satıra bağlayan tek şey budur. Başarılı bir yanıt yalnızca ayrıştırılmış gövdeyi döndürür, bu yüzden onda okunacak bir istek kimliği yoktur.