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

In [ruby-dev :3272 ] the message: "[ruby-dev:3272] Re: [REQ]
Thread.abort_on_exception and abort and exit ", on Jul/13 12:15(JST)
Yukihiro Matsumoto writes:

>まつもと ゆきひろです

>まあ,そう実装するのはそんなに大変じゃないんで構わないんです
>けど,これを決める前にabortの仕様を決めた方が良いように思い
>ますね.

はい.

>|>でも,例外としてキャッチできるならraiseでよいじゃないかって
>|>気もしますよね.abortならちゃんとabortしなきゃ.
>|
>|でも, exitも例外としてキャッチできますよね. だから, abortも例外でよい
>|ような気がします.
>
>その場合exitとabortの違いはなんになるんですかね?
>その辺を明確化したいですねえ.

実際に終了した時にバックトレースを出すかどうかってことになりますね.

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

>|3. 他のスレッド全てにもSystemExit例外を起こし, 全スレッドが全て例外を
>|   キャッチしない時のみ実際にexitする.
>
>現在の実装では実際に実行を中断しないとキャッチされるかどうか
>分かりませんから,「全て例外をキャッチしない」場合を判定する
>ために全部のスレッドに割込みがかかっちゃいます.これは多分望
>ましくないと思います.

分かりました.

>|1. exitを実行したスレッドがrescueしなかった時は, メインスレッドに
>|   SystemExitを再送する.
>|2. exitはSystemExitをメインスレッドに投げる.
>
>メインスレッドがなにを実行しているか分からない状態でいきなり
>送られても困るんじゃないでしょうか.しかも,Interruptのよう
>な割込み由来のものではなく,exitはプログラムが自発的に自分に
>対して呼ぶものですから.

うーん. どうなんでしょ? 困るってこともないとは思いますが, というのも,
SystemExitはキャッチしようと思わない限りキャッチできませんし, キャッチ
しようと思っているならそれなりの準備はできているはずですし. 

>3と違って全くダメというわけではないですし,現在の仕様では他
>のthreadでexitが呼ばれるとハンドルできないという問題はあるの
>で(私自身は問題ではないと思っているのですが),もう少し議論が
>進めば採用できると思いますが.

困るのは, irb見たいなダイレクトにRubyのコマンドを実行するツールとか動
的にコードを生成するツールだけのような気もしますけどね...

irbはまだ良いですけど, mine見たいなツールでexitしていきなり終了される
のも困り物でしょ? 今のRubyだと

  Thread.start{ raise SystemExit, "exit"}

されると, 防ぐ方法はないですし... 

# ないことはないか, exit/raise/failもredefしちゃえば良いのか... 

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