けいじゅ@SHLジャパンです. 

In [ruby-list :00387 ] the message: "[ruby-list:387] Re: about
exception ", on Aug/08 16:49(JST) matz / caelum.co.jp (Yukihiro
Matsumoto) writes:

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

>これもちょっと考えたんですけど,結局採用できないでいます.理
>由は
>  * 現在の例外処理の枠組をかなり変更しないとerrnoを上手に取
>    り出せない(現在のrubyはシステムコールの例外とそれ以外の
>    例外を区別していませんから).

システムコール関係であれば, ある変数にerrnoの値が入っているだけでもい
いんですけど...

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

これは, シンボルで比較するために必要だといいたいのかな? 

ただ, errno って POSIX で標準化されているんでしたっけ? ちゃんと標準化
されているのなら, いいのですが, 標準かの度合によっては, OS毎で互換性が
なくなってきますね...

それに, 非POSIX OSでは, 全然違うし...

rubyをどのようなプラットフォームに乗せるかで変わってきそう...

>|A. 例外処理 == エラー処理
>|B. 例外処理 == 通常の処理とは違う処理を行なうため.

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

なるほど. 

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

ですね. 私の個人的な好みとしては, (A)タイプの方なんですけどね... 

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

曲がりなりにも動くところに問題があると思うのですが... このケースは対し
た悪さを行なうことはないのですが...

>そういえばすごく昔にはエラーと例外が区別されていたような気が
>します.今回の石塚さんのコメントを見ているとそういうのを復活
>させくなりますね.
>
>メソッドが無いとか,定数が無いとか,コンパイル型の言語ならコ
>ンパイル時に分かるようなものは例外にせずエラーにしたら良いの
>ではないかという気がしてきました.まてよ,なんで例外に一本化
>したんだっけな? なんか理由があったような….

きっと, eval でエラーを起こすのがいやだったのでは? 

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

だいぶ問題点が整理されてきましたね.

>  * 「特別な戻り値」としての例外の利用は推薦しない.型の無い
>    rubyではnilを返すなどした方がよっぽど良い.
>  * 単なる大域脱出の手段としての例外の利用は推薦しない.この
>    目的にはcatch/throwを使って欲しい.

はい. これらは納得しました.

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

そうですねえ. (B)タイプの例外処理を行なわないのならば, あまりないとは思
うのですが...

例えば,

if File.exist?(name)
  ...
elsif File.readable?(name)
  ...
end
f = open(name)

を

begin
  f = open(name)
ensure
  if ファイルがなかった
    ...
  elsif ファイルのパーミッションがなかった
    ...
  else
    fail  
  end
end

とかやりたくなるのは, 私が(B)タイプの例外処理に毒されているせい??

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

どうなんですかね?

昔松本氏が, 文字列を読み込んで, 逐次evalするスクリプトを書きましたが, 
ああいうのは例外としてキャッチできないと困りますよね.

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

errno は, 自分でいったのですが 先ほどの問題がありますからねえ. 

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

文字列で比較するのは, 気分が悪いというだけです. 文字列は, 一般に唯一性
の保証がないので, エラーのようなものは, コードかシンボルで比較したいと
いうことでした. 

ただ, コードとかシンボルは, 整理がめんどくさいのも認めるのですが...

PS.
質問. rubyのエキスパートは何と呼ぶのでしょう?
rubypert? rubynitian?

__
..........................................石塚 圭樹@SHLジャパン(株)...
------------->アドレス変わりました!! e-mail: keiju / shljapan.co.jp <----