Иногда для проверки проблемы достаточно обратной обработки. Но иногда причина крушения не очевидна без знания того, что было передано функции.
Получение информации о том, что было передано функции, вызвавшей крах, было бы весьма полезно, особенно в случаях, когда воспроизведение не является очевидным, поскольку оно вызвано, например, исключением в сетевом соединении, странным пользовательским вводом или потому, что программа зависит от рандомизации или процессов данные от внешнего датчика.
Предположим, что существует следующая программа
def handle_changed_input(changed_input)
raise 'ops' if changed_input =~ /magic/
end
def do_something_with_user_input(input)
input = "#{input.strip}c"
handle_changed_input(input)
end
input = gets
do_something_with_user_input(input)
где пользователь вводит "магия" в качестве входа. Обычно имеет
test.rb:2:in `handle_changed_input': ops (RuntimeError)
from test.rb:7:in `do_something_with_user_input'
from test.rb:11:in `<main>'
в качестве вывода. Что можно сделать, чтобы показать также, что было передано для работы? Что-то вроде
test.rb:2:in `handle_changed_input("magic")': ops (RuntimeError)
from test.rb:7:in `do_something_with_user_input("magi\n")'
from test.rb:11:in `<main>'
Было бы полезно во многих ситуациях (и не очень полезно, когда параметры не представляются в виде строк разумного legth, есть веская причина, по которой он не включен по умолчанию).
Как можно добавить эту функциональность? Необходимо, чтобы программа работала, как обычно, во время нормальной работы, и предпочтительно до выхода из строя не было дополнительного выхода.
Я попытался, например,
def do_something_with_user_input(input)
method(__method__).parameters.map do |_, name|
puts "#{name}=#{binding.local_variable_get(name)}"
end
raise 'ops' if input =~ /magic/
end
input = gets
найден в Есть ли способ доступа к аргументам метода в Ruby?, но он будет печатать на каждом отдельном входе, чтобы функционировать, что оба будут наводнения на выходе и значительно замедлить работу программы.