もっと簡単にデバッグ用にメソッドの呼び出し元(スタックトレース)をログに出力する方法
2009-10-19
昨日の日記で、メソッドの呼び出し元をログに出力する方法について書いた。 それは、メソッド内で意図的に例外を発生させ、例外オブジェクトのスタックトレースから呼び出し元を知るというもの。 そうしたら、caller メソッドを使ってスタックトレースが取得できるツッコミをいただいた。 caller メソッドは知らなかったので、両者を比較してみた。
例外オブジェクトからスタックトレースを得る方法(昨日の日記より)
def some_method
begin
raise Exception.new
rescue Exception => e
STDERR.puts e.backtrace.join(", ")
end
# ここから関数本体
end
caller メソッドでスタックトレースを得る方法(ツッコミでのご指摘)
def some_method
STDERR.puts caller.join(", ")
# ここから関数本体
end
まとめ
どうみても caller メソッドの方がシンプル。 これだけで終わっては面白くないので、 caller の戻り値を調べてみた。 戻り値は文字列の配列で、文字列はスタックトレースと同じ形式 (ファイル名:行番号:メソッド名) になってた。
$ irb
irb(main):001:0> c = caller
=> ["/opt/local/lib/ruby/1.8/irb/workspace.rb:52:in `irb_binding'", "/opt/local/lib/ruby/1.8/irb/workspace.rb:52"]
irb(main):002:0> c.class
=> Array # caller の戻り値は文字列の配列
irb(main):003:0> c.first.class
=> String
irb(main):004:0> puts c # 文字列はスタックトレースと同じ形式 (ファイル名:行番号:メソッド名)
/opt/local/lib/ruby/1.8/irb/workspace.rb:52:in `irb_binding'
/opt/local/lib/ruby/1.8/irb/workspace.rb:52
=> nil