けいじゅ@日本ラショナルソフトウェアです.

メイルをマージします.

In [ruby-dev :3258 ] the message: "[ruby-dev:3258] Re: [BUG]
Thread.abort_on_exception ", on Jul/10 17:19(JST) Yukihiro Matsumoto
writes:

>まつもと ゆきひろです

>abortの挙動を定義しないといけませんね.今の定義は
>
>  $!がセットされていればバックトレースを出力してexitする
>
>というものですが.abort_on_exceptionは名前からしてabortと同
>じ動作をすべきのように思えます.が,例外をmain_threadに送り
>つけるという仕様でも妥協できます.
>
>どっちがよいんでしょうねえ.

やはり, デバッガとの兼ねあわせを考えると, 後者の方がありがたいですね.

In [ruby-dev :3259 ] the message: "[ruby-dev:3259] Re: [REQ] abort ",
on Jul/10 17:23(JST) Yukihiro Matsumoto writes:

>まつもと ゆきひろです

>|私のイメージだと abort(3)の感じだったもので. コアダンプの代わりにバッ
>|クトレースを出力すると.
>
>まあ,問題にしているのは直前に発生した例外ではなくabortする
>という行為であると考えると,現在のスタックトレースを出すとい
>うのも納得できる仕様です.どっちが良いですか?

>|でも, Thread.abort_on_exceptionと同じで例外としてキャッチできないのも
>|変なのかな??
>
>でも,例外としてキャッチできるならraiseでよいじゃないかって
>気もしますよね.abortならちゃんとabortしなきゃ.

でも, exitも例外としてキャッチできますよね. だから, abortも例外でよい
ような気がします.

exit --> SystemExit
abort --> SystemAbort

いかがでしょう?


ところで, exitの動作ですけど...

begin
  Thread.start do
    begin
      exit
    rescue SystemExit
      p "a"
    end
  end
  sleep 5
rescue SystemExit
  p "b"
end

これは, 中のrescueでキャッチできます.

begin
  Thread.start do
    begin
      exit
    rescue
      p "a"
    end
  end
  sleep 5
rescue SystemExit
  p "b"
end

これだと例外をキャッチできないんですね. でも, 他のスレッド特にメインス
レッドとしてはこのままexitされても嬉しくないですよね?

1. exitを実行したスレッドがrescueしなかった時は, メインスレッドに
   SystemExitを再送する.

2. exitはSystemExitをメインスレッドに投げる.

3. 他のスレッド全てにもSystemExit例外を起こし, 全スレッドが全て例外を
   キャッチしない時のみ実際にexitする.

のどれかが良いと思うのですがいかがでしょう?


__
................................石塚 圭樹@日本ラショナルソフトェア...
----------------------------------->> e-mail: keiju / rational.com <<---