2017-01-10 36 views
1

Допустим, у вас есть следующий пример кода блока:Получить метод, который вызвал ошибку, используя 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 вызвал проблему? Я знаю, что трассировка стека доступна, но это не так.

+0

Что именно вы хотите сделать? Мне это непонятно. –

+2

Как вы думаете, для возврата? Это точно для таких запросов. –

+0

Я хотел бы знать, есть ли метод, который может быть вызван, который вернет имя «client.list_order_items_by_next_token»: я настраиваю раздел повтора, но мне нужно знать, что вызвало ошибку, чтобы вытащить сообщение из файла локали , @EddeAlmeida –

ответ

0

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

error.backtrace 

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

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

+0

Большое вам спасибо за отличную дискуссию –