at posts/single.html

もっと簡単にデバッグ用にメソッドの呼び出し元(スタックトレース)をログに出力する方法

昨日の日記で、メソッドの呼び出し元をログに出力する方法について書いた。 それは、メソッド内で意図的に例外を発生させ、例外オブジェクトのスタックトレースから呼び出し元を知るというもの。 そうしたら、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

関連する日記