チケット #1954 が更新されました。 (by Yusuke Endoh)


遠藤です。

> この現象について調べて見ました。

ありがとうございます。


> 対策として
> ・そういうものとして割り切る(仕様変更とする)
> ・プロセス終了処理中のメインスレッドでの例外は表示しない
> ・プロセス終了処理中はメインスレッドへ例外を伝播させない
> ・トップフレームでの例外は表示しない
> といったものを考えましたが、どうするのが最適かは私にはわかりません。

個人的にはどれでもいいと思います。
別の候補として、0 だったら行番号だけ省略するパッチを書いてみました。
慎重さを要する懸案ではないと思うので、さっさと直してしまいたいと思います。


$ git diff eval.c
diff --git a/eval.c b/eval.c
index 6deed9c..a1deab6 100644
--- a/eval.c
+++ b/eval.c
@@ -394,11 +394,16 @@ setup_exception(rb_thread_t *th, int tag, volatile VALUE mesg)
        PUSH_TAG();
        if ((status = EXEC_TAG()) == 0) {
            RB_GC_GUARD(e) = rb_obj_as_string(e);
-           if (file) {
+           if (file && line) {
                warn_printf("Exception `%s' at %s:%d - %s\n",
                            rb_obj_classname(th->errinfo),
                            file, line, RSTRING_PTR(e));
            }
+           else if (file) {
+               warn_printf("Exception `%s' at %s - %s\n",
+                           rb_obj_classname(th->errinfo),
+                           file, RSTRING_PTR(e));
+           }
            else {
                warn_printf("Exception `%s' - %s\n",
                            rb_obj_classname(th->errinfo),

$ cat t.rb
$DEBUG = true
Thread.start do
  begin
    Process.kill(:INT, $$)
  ensure
    raise
  end
end.join

$ ./miniruby t.rb
Exception `Interrupt' at t.rb:2 -
Exception `RuntimeError' at t.rb:6 -
Exception `RuntimeError' at t.rb -
t.rb:2:in `join': Interrupt
        from t.rb:2:in `<main>'

-- 
Yusuke Endoh <mame / tsg.ne.jp>
----------------------------------------
http://redmine.ruby-lang.org/issues/show/1954

----------------------------------------
http://redmine.ruby-lang.org