Как мне добавить обработку ошибок по умолчанию к функции, которая производит итерацию? - PullRequest
1 голос
/ 06 мая 2020

У меня есть модель Transaction и метод external_evaluation. external_evaluation проходит вниз по стеку и в конечном итоге вызывает лямбду AWS. Если ответ плохой, возникает исключение BadResponse.

В кодовой базе есть шаблон, который часто используется, например,

def get_some_transactions() 
  Transaction.where(some_column: some_expression)
end

def do_some_stuff()
  get_some_transactions.each do |transaction|
    do_something(transaction.external_evaluation)
  rescue BadResponse => e
    log(e)
    next
  end
end

def do_some_other_stuff()
  get_some_transactions.each_with_object({}) do |transaction, transaction_hash|
    transaction_hash[transaction] = do_something_else(transaction.external_evaluation)
  rescue BadResponse => e
    log(e)
    next
  end
end

Мне очень не нравится дублирование кода обработки ошибок в этом шаблоне, и я хотел бы иметь возможность для добавления обработки ошибок по умолчанию в get_some_transactions, которая будет применяться независимо от того, какая итерационная функция вызывается (each, each_with_object, each_with_index, ...). Есть ли идиоматический c способ сделать это в Ruby?

Ответы [ 2 ]

0 голосов
/ 06 мая 2020
def with_error_handing(&block)
  begin
    yield
  rescue BadResponse => e
    log(e)
  end
end

def do_some_stuff()
  get_some_transactions.each do |transaction|
    with_error_handing do
      do_something(transaction.external_evaluation)
    end
  end
end

def do_some_other_stuff()
  get_some_transactions.each_with_object({}) do |transaction, transaction_hash|
    with_error_handing do
      transaction_hash[transaction] = do_something_else(transaction.external_evaluation)
    end
  end
end
0 голосов
/ 06 мая 2020

Вы можете переместить метод rescue в external_evaluation.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...