mruby の例外の backtrace は Fiber.resume より呼び出し元に近い関数は含まれない。
この動作は CRuby も同じではあるが
時々不便に感じていたので Fiber.resume の呼び出し元のバックトレースが含まれるようにする mrbgems を作ってみた。
sample.rb
begin
fb = Fiber.new do
Fiber.yield
raise "ttt"
end
fb.resume
fb.resume
rescue => e
puts "e.backtrace"
puts "#{e.backtrace.map{|v| " " + v}.join("\n")}"
end
mruby-better-fiber-backtrace を使ってない場合だと以下の様な出力である。
e.backtrace
./sample.rb:10
出力が backtrace を読んだ位置になっているので以下の mrbgems を割り当てると
https://github.com/dycoon/mruby-ruby-like-backtrace
(関係する記事はこちら
mruby で例外が起こった場所の backtrace を rescue 節など他の場所でも取得できるようにする)
以下のようになる。
e.backtrace
/work/small_repos/mruby-ruby-like-backtrace/mrblib/ruby_like_backtrace.rb:19:in Exception.initialize
sample2.rb:4
raise された位置は出てくるが Fiber.resume より呼び出し元に近い関数は出力されない。
mruby-better-fiber-backtrace を使うと以下のように出力される。
e.backtrace
/work/small_repos/mruby-better-fiber-backtrace/tmp/mruby/build/mrbgems/mruby-ruby-like-backtrace/mrblib/ruby_like_backtrace.rb:19:in Exception.initialize
./sample.rb:4
/work/small_repos/mruby-better-fiber-backtrace/tmp/mruby/build/mrbgems/mruby-ruby-like-backtrace/mrblib/ruby_like_backtrace.rb:19:in Exception.initialize
/work/small_repos/mruby-better-fiber-backtrace/mrblib/better_fiber_backtrace.rb:16:in Fiber.resume
./sample.rb:7
Fiber.resume がどこから呼びだされているかわかりやすい。