[ruby][merb] MerbがRuby 1.8.7にしたら動かなくなった? (深追い編)
MerbがRuby 1.8.7にしたら動かなくなった?の続きです。
深追いしたところ原因が(だいたい)分かりました。MerbはParseTreeというライブラリを使ってるんですが、このライブラリがどうもインストール時(というより初回使用時?)のRubyのバージョンと現在のRubyのバージョンが違っていると動かないようです。なので、ParseTreeをgem installしなおしたら解決しました。*1
このバージョンの食い違いが起きているときは本来
/usr/local/lib/ruby/gems/1.8/gems/ParseTree-3.0.3/lib/parse_tree.rb:152:in `parse_tree_for_meth': bad version, 1.8.7 != 1.8.6 (fatal)
というエラーで落ちるはずなのですが、なぜかこのエラーがコンソールにもブラウザにも表示されず、単に空のレスポンスを返すという挙動になってしまっているようです。
この原因はちゃんと追ってないのですが、たとえば以下のコードでは、やはり何のメッセージも出さずにRubyが終了します(ステータスコード自体は非ゼロになってるようです)。どうも、fatal errorが何らかの例外ハンドラを通った場合に、(そのハンドラでは捕捉されないにもかかわらず)メッセージが消えてしまうようです。
require "rubygems" require "inline" class Hoge inline do |builder| builder.c <<-EOS static VALUE hoge() { rb_fatal("hoge"); return Qnil; } EOS end end begin Hoge.new().hoge() rescue => ex p ex # fatal errorは捕捉できないのでここには来ない end # が、fatal errorのメッセージも出ない
2009/7/26追記: Ruby 1.9.1では起こらないようです。