2016-04-11 5 views
2

My RailsのWebサイト(この問題は純粋にRubyベースですが)は、テスト/開発環境でAWS-SES(AWSを使用するActionメーラー)宝石を使用しています。この定義されていないエラーからレスキュー

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

さて問題は、開発には存在しませんAWSつまり、この宝石は、特定の環境のために定義されていることで、エラーチェックコードは、したがって、未定義の定数のために(笑)、エラーがスローされますように配達。

私は(AWS::SES::ResponseError if defined?(AWS)ためにその行をsubstuting試してみましたが、その後私が手に次のエラーが、私は可能素敵な方法でこれを回避するにはどうすればよい

rescue節のために必要なクラスやモジュール

です?

+0

開発でAWS :: SESを使用できないのはなぜですか? –

+0

まあ実際にはできますが、私は通常私が使用していないことを知っている宝石をロードしません(私はいつも 'letter_opener_web'を使っています、私は本物の電子メールを送りたくありません)。 'aws-ses'テスト/プロダクトグループの下の宝石 –

答えて

4

レスキュー句の例外リストには、リテラル/静的リストである必要はありません。

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

スプラットオペレータ*がリストに配列を変換するために、ここで使用されています。

+0

ああ素敵!私たちはそのスプラット演算子を頻繁に使用することはありませんが、ここで便利です!ルビーの魔法:) –

2

あなたはrescue句で条件を含めることはできませんが、あなたは救助を盲目にし、それは従来のRubyのコードを使用して対処する方法についてうるさい得ることができます。

rescue EOFError => e 
    log_exception(e) 

    e 
rescue => e 
    if (defined?(AWS) and e.is_a?(AWS::SES::Response)) 
    # ... 
    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 

:あなたはいつもよりきれいにテストするいくつかのモジュールにその多くをカプセル化することができ

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

    e 
    else 
    raise e 
    end 
end 

あなたはこのAを作ることができますlog_exceptionが返された場合はそれが与えられた例外を返します。 Rubyがデフォルトで "return"であることを忘れないでください。あなたが早くそれをやっていない限り、明示的にする必要はありません。

関連する問題