Получить метод, вызвавший ошибку, с помощью Rescue

Допустим, у вас есть следующий пример блока кода:

  def next_page(next_token)
    client.list_order_items_by_next_token(next_token)
  rescue => error
    binding.pry
  end

Не углубляясь в проблему, что это спасение фиксирует все ошибки и насколько это плохо (этот блок был изменен), есть ли способ определить метод list_order_items_by_next_token, вызвавший проблему? Я знаю, что трассировка стека доступна, но мне кажется, что это неправильно.


person Chris Hough    schedule 10.01.2017    source источник
comment
Что именно вы хотите сделать? Мне непонятно.   -  person Ed de Almeida    schedule 10.01.2017
comment
Как вы думаете, для чего нужна обратная связь? Именно для таких запросов.   -  person Sergio Tulentsev    schedule 10.01.2017
comment
Я хотел бы знать, есть ли метод, который можно вызвать, чтобы вернуть имя client.list_order_items_by_next_token : я настраиваю раздел повторных попыток, но мне нужно знать, что вызвало ошибку для извлечения сообщения из файла локали. @ЭддеАлмейда   -  person Chris Hough    schedule 10.01.2017
comment
@SergioTulentsev помог этот комментарий?   -  person Chris Hough    schedule 10.01.2017
comment
@chrishough: стало немного понятнее, что ты задумал, но ответ все тот же. :)   -  person Sergio Tulentsev    schedule 10.01.2017
comment
копаться в error.backtrace;)   -  person Andrey Deineko    schedule 10.01.2017
comment
Это единственный способ @AndreyDeineko? это было бы довольно медленно, верно?   -  person Chris Hough    schedule 10.01.2017
comment
Позвольте мне решить проблемы с производительностью в ответе.   -  person akuhn    schedule 10.01.2017


Ответы (1)


Просто используйте

error.backtrace

Не беспокойтесь о производительности.

К тому времени, когда вы спасете исключение, стоимость создания обратной трассировки уже произошла. Обратная трассировка создается при возникновении исключения. И это дорого! Ruby должен создавать O(N) новых строк всякий раз, когда возникает исключение, где N — это глубина трассировки стека. Которых может быть 1000+ в приложении Common Rails. В цикле становится еще хуже. И все эти строки обычно никогда не используются и просто засоряют сборку мусора. В нашей производственной системе эти строки обратной трассировки являются одной из основных причин снижения производительности. Но, как я уже сказал, эта стоимость возникает, когда возникает исключение, доступ к обратной трассе позже бесплатен.

person akuhn    schedule 10.01.2017