干燥重复的救援声明

Tos*_*shi 3 ruby error-handling

我使用 stripe 作为支付处理器。

在应用程序中,我向 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
Run Code Online (Sandbox Code Playgroud)

虽然我可以肯定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
Run Code Online (Sandbox Code Playgroud)

Ama*_*dan 5

不太确定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
Run Code Online (Sandbox Code Playgroud)