2017-01-18 21 views
3

私はストライプを支払いプロセッサーとして使用します。レスキューステートメントを繰り返し実行する

アプリケーション内で、Stripeに請求を送信したり、他のタイプのプロセスに対してリクエストを送信します。基本的には、以下のような同じエラー処理の定型文を使用します。

rescue Stripe::InvalidRequestError => e, 
    # do something 
rescue Stripe::AuthenticationError => e, 
    # do something 
rescue Stripe::APIConnectionError => e, 
    # do something 
rescue Stripe::StripeError => e 
    # do something 
rescue => e 
    # do something 
end 

私は間違いなくrescue各APIの呼び出しでこれらのエラーの種類ごと、それは定型コードの多くのですが、私はちょうどrescueそれらのすべてのに愛し、そのようなことを行うための方法を構築したいこともできますがロギングとして、通知を送信する。

これらを1つの例外ハンドラに、以下のようなよりクリーンな方法(乾いたもの)でバンドルする方法はありますか?

def call 
    plan = Plan.new(attrs) 
    return plan unless plan.valid? 

    begin 
    external_card_plan_service.create(api_attrs) 
    rescue Exceptions::Stripe => e 
    plan.errors[:base] << e.message 
    return plan 
    end 

    plan.save 
    plan.update(is_active: true, activated_at: Time.now.utc) 
    plan 
end 
+0

ストライプがあなたの場合、これらの例外は共通の例外を継承することができます。それは...ですか? –

答えて

4

あなたのアプリのどこかに、レスキューするエラーのリストを返す変数/定数/メソッドを定義します。レスキューブロックで

STRIPE_ERRORS = [Stripe::InvalidRequestError, String::AuthenticationError] 

ザ・、あなたがこれらのいずれかを救出するためにスプラット演算子を使用することができます:たとえば

begin 
    <raise errors> 
    rescue *STRIPE_ERRORS => e 
    <handle errors> 
    end 

あなたはe.class

4

で育ったエラーのどの確認することができますdo somethingがそれぞれのケースで同じかどうかは不明です。そうでない場合、これはあなたが望むことができるかもしれません:

def handle_stripe_errors 
    yield 
rescue Stripe::AuthenticationError => e, 
    # do something 
rescue Stripe::APIConnectionError => e, 
    # do something 
rescue Stripe::StripeError => e 
    # do something 
rescue => e 
    # do something 
end 

handle_stripe_errors do 
    external_card_plan_service.create(api_attrs) 
end 
+0

答えをありがとう!私はこれが私にはとても分かりやすいと思う。私は#何かがまったく同じであれば、 'handle_stripe_errors'のためのいくつかのモジュールを作り、どこにモジュールを置くべきでしょうか? – Tosh

+0

'#do something'が同じなら、おそらくmaxpleの解法を使うことができます。私はあなたのプログラムのアーキテクチャを知らないので、ラッパー関数にとって最適な場所はどこにあるのかは分かりません。 – Amadan

+0

私はサービスオブジェクトとwebhook内のメタデータを使用してメタデータを展開します。 – Tosh

関連する問題