2017-01-18 4 views
3

Я использую полосу в качестве процессора платежей.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

Если Stripe принадлежит вам, вы можете иметь эти исключения наследовать общее исключение. Это? –

ответ

4

Где-то в вашем приложении определите метод variable/constant /, который возвращает список ошибок, которые вы хотите спасти. Например:

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

Если '# делать что-то ', то вы, вероятно, можете использовать решение maxple. Я не знаю архитектуры вашей программы, поэтому не могу сказать вам, где будет лучшее место для функции обертки. – Amadan

+0

Я использую те, которые находятся в объекте службы, и webhook для расширения метаданных. – Tosh

Смежные вопросы