p e.backtrace
Я запустил его на сеансе IRB, у которого нет источника, и он все еще дал соответствующую информацию.
=> ["(irb):11:in `foo'",
"(irb):17:in `irb_binding'",
"/usr/lib64/ruby/1.8/irb/workspace.rb:52:in `irb_binding'",
"/usr/lib64/ruby/1.8/irb/workspace.rb:52"]
Если вы хотите хорошо проанализировать обратную трассировку, может пригодиться следующее регулярное выражение:
p x.backtrace.map{ |x|
x.match(/^(.+?):(\d+)(|:in `(.+)')$/);
[$1,$2,$4]
}
[
["(irb)", "11", "foo"],
["(irb)", "48", "irb_binding"],
["/usr/lib64/ruby/1.8/irb/workspace.rb", "52", "irb_binding"],
["/usr/lib64/ruby/1.8/irb/workspace.rb", "52", nil]
]
(Regex / должен быть / безопасен от странных символов в именах функций или каталогах / именах файлов)
(Если вам интересно, откуда взялся foo, я попытался исключить исключение:
>>def foo
>> thisFunctionDoesNotExist
>> rescue Exception => e
>> return e
>>end
>>x = foo
>>x.backtrace