[#380] bug report#3 and request#5 — keiju@... (Keiju ISHITSUKA)
けいじゅ@SHLジャパンです.
1 message
1996/08/06
[ruby-list:396] Re: about exception
From:
Date:
1996-08-09 09:42:48 UTC
List:
ruby-list #396
けいじゅ@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 <----