2017-01-18 98 views
3

我使用stripe作爲付款處理器。DRYing重複營救陳述

在應用程序中,我向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上所有的人,然後再建做的事情這樣的方法作爲日誌記錄,發送通知。

我怎樣才能以更乾淨的方式將這些組合到一個異常處理程序中?

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

募集不太確定是否與每種情況相同。如果沒有,這可能做你想要的:

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

如果'#做一些事情'是一樣的,你可以使用maxple的解決方案。我不知道你的程序的體系結構,所以不能告訴你哪裏是包裝函數的最佳位置。 – Amadan

+0

我使用服務對象和webhook中的擴展元數據。 – Tosh