2016-04-11 10 views
2

Rails web sitem (bu sorun tamamen Ruby tabanlı olsa da) test/geliştirme ortamında AWS-SES (AWS kullanarak Action mailer) gemini kullanıyor ve e-postadaki olası hataları yakalarım BuTanımlanamayan bir hatadan kurtarma

def try_delivering_email(options = {}) 
    begin 
     yield 
     return false 
    rescue EOFError, 
      ... 
      AWS::SES::ResponseError, 
      ... => e 
     log_exception(e, options) 
     return e 
    end 
end 

gibi teslimatlar Şimdi problem bu taş sadece gelişiminde yok AWS başka bir deyişle, belirli ortamlar için tanımlandığını ve hata denetimi kodu nedenle tanımlanmamış sabiti için bir hata (haha) atacağım .

Ben (AWS::SES::ResponseError if defined?(AWS) için o satırı substuting denedi ama sonra olsun bir sonraki hata

nasıl en güzel şekilde bu sorunun üstesinden gelebilirsiniz kurtarma maddesinin için gerekli

sınıf veya modülüdür ?

+0

Neden AWS :: SES'i geliştirmede kullanamıyorsunuz? –

+0

Aslında yapabilirim, ama genellikle kullanmıyorum bildiğim taşlar yüklemiyorum (geliştirme içinde her zaman 'letter_opener_web' kullanıyorum, gerçek e-posta göndermek istemiyorum), bu yüzden benim gemfile sadece ekledim 'aws-ses' gem test/prod grubu altında –

cevap

4

bir kurtarma-fıkra ait istisna listesi bir hazır/statik liste olmak zorunda değildir:

excs = [EOFError] 
defined?(AWS) && excs << AWS::SES::Response 
# ... 
rescue *excs => e 

operatör * bir liste halinde bir dizi dönüştürmek için buraya kullanılır işaret.

+0

Ah güzel! Bu uyarıcıyı çok sık kullanmıyoruz ama kesinlikle burada işe yarar! Ruby'nin büyüsü :) –

2

Bir rescue yan tümcesinde bir koşullu içeremez, ancak kurtarma kör ve ardından geleneksel Yakut kodunu kullanarak onunla nasıl başa konusunda seçici alabilirsiniz:

rescue EOFError => e 
    log_exception(e) 

    e 
rescue => e 
    if (defined?(AWS) and e.is_a?(AWS::SES::Response)) 
    # ... 
    else 
    raise e 
    end 
end 

O değil güzel yolu, ancak Bu işi yapar. Bu a yapabiliriz

rescue => e 
    if (loggable_exception?(e)) 
    log_exception(e) 

    e 
    else 
    raise e 
    end 
end 

:

def loggable_exception?(e) 
    case (e) 
    when EOFError, AnotherError, EtcError 
    true 
    else 
    if (defined?(AWS) and e.is_a?(AWS::SES::Response)) 
     true 
    else 
     false 
    end 
    end 
end 

Sonra kendini açıklayıcı olması gerektiğini metot adı olarak yapabilirsiniz: Her zaman daha düzgünce testleri bazı modülün içine bir sürü saklanması olabilir log_exception ise verilen küçük istisnalar istisna geri döndü. Ruby'nin "return varsayılan" olduğunu ve bunu erken yapmadığınız sürece açık olması gerekmediğini unutmayın.