From: Yukihiro Matsumoto Date: 2009-08-19T17:06:30+09:00 Subject: [ruby-dev:39129] Re: [Bug #1952] cannot stop with Ctrl+C まつもと ゆきひろです In message "Re: [ruby-dev:39128] Re: [Bug #1952] cannot stop with Ctrl+C" on Wed, 19 Aug 2009 16:35:56 +0900, "U.Nakamura" writes: |In message "[ruby-dev:39127] Re: [Bug #1952] cannot stop with Ctrl+C" | on Aug.19,2009 16:00:28, wrote: |> うーん、ensureでraiseしたり、その外でrescueでretryしたりして |> いるわけですから、無限ループそのものは「意図通り」なのではな |> いでしょうか。むしろ、raiseがTAG_FAGALで飛ぶ方が気持ちが悪い |> です。 | |私としてはTAG_FATALが握りつぶし可能であることの方が気持ちが悪 |いです。 これなんですが、そもそもなぜInterruptがTAG_FATALなんでしょう か。1.8では普通にTAG_RAISEだと思います。もちろん、うささんに 聞いてもしょうがないんですが。 |つまり、いかなる方法でensure節が終了した場合(raiseだろうがreturn |だろうがend到達だろうが)も、TAG_FATALとしての処理を続行すべき |ではないか、ということです。 |私の元の文面がよくありませんでしたが、TAG_RAISEでないTAG_FATAL |な例外を発生させる、という意図はありません。 | |こういう言い方だと「気持ちが悪」くなくなるでしょうか? |それとも、「意図通り」のはずの無限ループが中断されることが「 |気持ちが悪い」のでしょうか? 私の感想は * C-cでTAG_FATALが発生する現状が気持ち悪い * ensure + raise で例外を握り潰すことができるのは以前から 知られていたことであり、それをできなくする必然性がわから ない ということです。さらに * kill -9を必要とするのは問題である。ので、main threadは割 り込み可能にしておくべき * C-cでTAG_RAISEであるべき(だと思う) * C-cのことは別にして、うささんがおっしゃるようにTAG_FATAL 状態でensureした場合、たとえ途中で通常のraiseがあってもそ れは無視して、TAG_FATALを継続するという仕様は十分ありえる と思います。 まつもと ゆきひろ /:|)