まつもと ゆきひろです.

In message "[ruby-list:386] Re: about exception"
    on 96/08/08, Keiju ISHITSUKA <keiju / shljapan.co.jp> writes:
|
|けいじゅ@SHLジャパンです. 

|これに関しては, ruby でも errno が取り出せると嬉しいですね.

これもちょっと考えたんですけど,結局採用できないでいます.理
由は

  * 現在の例外処理の枠組をかなり変更しないとerrnoを上手に取
    り出せない(現在のrubyはシステムコールの例外とそれ以外の
    例外を区別していませんから).

  * errnoの整数の値をrubyに取り込む方法を用意しなくてはいけ
    ない(モジュールに片っ端から定義する or h2rbを作る?)

などですね.

|では, rubyにおける例外とは何でしょうか?
|
|A. 例外処理 == エラー処理
|B. 例外処理 == 通常の処理とは違う処理を行なうため.
|
|rubyの例外の目的が (A)であるならば, 現在の仕様で全然問題ないと思います.
|(B)を目的とするのであれば, 個別の例外について捉えやすくするような仕組
|みが必要になると思います.

rubyの例外は基本的に(A)を目的としています.通常の処理とは違
う3のような場合には他のテクニックを使うことをお勧めします.
rubyのライブラリではよく特別な場合にはnilを返しています(例:
String#index).

また,特別な大域脱出のためにはcatch/throwという仕組みを用意
しています.

C++の例外機能(例外をかならず種類別に受け取らなくてはいけない)
をベースにしたObjectStoreとはちょっと使い方が違って来るでしょ
うね.

|でも, もし,
|
|begin
|  uname = Etc.getpwuid(uid).uname
|rescue
|  uname = uid.to_s
|end
|
|なんてしていたら, どうなります? pwの構造体にはunameなんてメンバはない
|ので例外が発生します. で, それはresqueで捉えられて とりあえず 動作して
|しまいます. これは, (3)の処理をするつもりで(2)まで拾ってしまった例です
|ね. 

これは3というよりも複数の例外が発生しちゃって,区別できなかっ
たという例ですね.私は大体の場合はそれでも良いんじゃないかと
思っています(いいかげんな性格なもんで).すくなくともこの場合
は「曲がりなりにも」動きますよね.で,「どうしてみんなuidの
数字しか表示されないんだろう」と思ってrescue節に print $! と
か入れてみて uname の間違いを発見してもそれはそれで良いよう
に思います(え,それじゃダメ?).

# デバッガが無いのが問題だという話もある,薮蛇だ.

そういえばすごく昔にはエラーと例外が区別されていたような気が
します.今回の石塚さんのコメントを見ているとそういうのを復活
させくなりますね.

メソッドが無いとか,定数が無いとか,コンパイル型の言語ならコ
ンパイル時に分かるようなものは例外にせずエラーにしたら良いの
ではないかという気がしてきました.まてよ,なんで例外に一本化
したんだっけな? なんか理由があったような….

|ruby では この様な(B)のタイプの例外処理は, 推薦しないということなので
|しょうか? このようなタイプの例外処理はそんなに少なくはないと思うのです
|が...

Bタイプというのでいくつか出ましたが,再度まとめると

  * 「特別な戻り値」としての例外の利用は推薦しない.型の無い
    rubyではnilを返すなどした方がよっぽど良い.

  * 単なる大域脱出の手段としての例外の利用は推薦しない.この
    目的にはcatch/throwを使って欲しい.

  * 複数の例外が発生してしまう場合はたしかにありえると思う.
    が,その場合でも本当に区別しなければならない場合は少ない
    と考えている($!で分岐すれば現在でも可能).

  * ただし,コンパイル型の言語ならコンパイル時に見付けられる
    ような「エラー」も例外になっているrubyの問題点(欠点?)に
    ついては今回初めて認識した.これについては対策を検討する
    (が,なにもしないかもしれない).

  * errnoが整数で取り出せると便利なような気もするが,結局シ
    ンボル(ENOENTとか)で比較するのだから文字列と比較してもあ
    まり問題ではないような気もする(ドキュメントがちゃんとし
    ているとすれば).

という具合になります.

|私は機能を拡張してほしいといっているつもりはなくて, メッセージレベルで
|工夫をすればもっと使いやすくなるのでは? といいたいだけです. それだけで
|(B)のケースの例外処理も行ないやすくなるわけです.

えっと,石塚さんの提案だと $! のフォーマットを変更するという
ものだったと思いますが,具体的にはどういう風に便利になります
か? ちょっとイメージが掴めません.

                                まつもと ゆきひろ /:|)