15

問題を診断するには、バックトレースで十分な場合があります。しかし、関数に何が渡されたかを知らなければ、クラッシュの理由が明らかでない場合があります。

クラッシュの原因となった関数に渡された情報を取得することは、特にネットワーク接続の例外、奇妙なユーザー入力、またはプログラムがランダム化に依存しているか、外部からのデータを処理しているために発生したために再現が明らかでない場合に非常に役立ちます。センサー。

次のプログラムがあるとしましょう

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)

ユーザーが入力として「magic」と入力した場所。通常、1つは持っています

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>'

これは多くの状況で役立ちます (パラメータが妥当な長さの文字列として表現できない場合は、実際には役に立ちません。デフォルトで有効にされていないのには十分な理由があります)。

この機能をどのように追加できますか? 通常の動作中はプログラムが通常どおりに動作する必要があり、クラッシュする前に追加の出力がないことが望ましいです。

私は例えば

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 でメソッド引数にアクセスする方法はありますか? しかし、すべての入り口で機能するように出力され、出力があふれてプログラムが大幅に遅くなります。

4

4 に答える 4