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

In [ruby-list :00397 ] the message: "[ruby-list:397] Re: about
exception ", on Aug/09 19:37(JST) matz / caelum.co.jp (Yukihiro
Matsumoto) writes:

>そうなんですよ.文字列にしておけば「人間に分かる情報」が入っ
>ている,で済むんですけど,シンボルや数値にしちゃうとプラット
>フォーム間でどうやって整合性をとるかという話になっちゃうでしょ
>う?

>たとえば将来NT版を作ったりすることを考えるとちょっと避けたい
>気になりません? 

ですね.
でも, 現状の perror() のメッセージを流用というのも問題ありですよね. 

>多分,そうなんでしょう(ensureはrescueの間違いですよね).
>  f = open(name)
>だけとか(例外は捕捉しない,プログラムは中断)
>
>  begin
>    f = open(name)
>  rescue
>    f = 代わりのディスクリプタ
>  end
>
>くらいがrubyらしい感じがします.

でも, よくよく考えるとCとかでも,

FILE *f = fopen(name,...)
if (f == 0) {
  if (errno == ファイルがなかった) {
    ...
  }
  else if (errno == ファイルのパーミッションがなかった) {
    ...
  }
  else {
    ...
  }
}

などとできますよね. このような例外処理の形態は一般的なような気がしてき
ました. やはり, 私が思うに, 例外処理の形態は,

1. 大きく分ける場合:

begin
  通常処理
rescue
  例外処理
  exit
end

2. 細かく対処する場合:

begin  
  通常処理
rescue
  if 個別の例外
    個別の例外処理
  else 
    # 対処できない場合
    fail
  end
end

となるのではなかろうかと思います. (1)の場合は, どんな例外でもとりあえ
ず後処理して exit する. (2)の場合は, 特定すべき例外だけの処理を行ない,
継続して処理を続ける. というものです. (2)のケースでもどんな例外でも区
別せずに例外処理を行なうのは危険過ぎると思います(A).

松本氏は, 例外が同時に複数発生することは少ないのでは? という意見でした
が... どうもそうではないと思います. 

いままで, struct/File.openの例を出しましたが, 他にも, rubyでは, trapが
設定していなくて, シグナルが発生すると例外が発生しますよね? (A)のよう
なプログラムを組むとプログラムが停止できなくなってしまいます.

>Cじゃないんですから文字列の比較をそんなに嫌わなくても….

でも, 文字列って変わりそうでいやじゃありませんか? 今後 ruby のバージョ
ンが上がってメッセージが変わったりすると, そのたびに修正しなくてはなら
なくなるし...

追加:: 
rescue で実行の再開はできないのですか? つまり, エラーの発生したところ
からということなのですが...

例えば, 次のような時に困るのです. 

# あるライブラリ
class Foo 
  def each
    ... 
    # (I) ここで例外が起こる
    yield
  end
end

# ユーザプログラム
foo = Foo.new
for f in foo 
  ...
  #(II)
end

このようなプログラムにおいて, (I)で発生した例外をeach()の外, つまり, 
ユーザプログラム側でキャッチして, 例外処理を行ない場合によっては処理を
継続したいわけです. 

(I)で発生した例外は, (II)では捕捉できないわけですよね? そうなると,

begin #(IV)
  foo = Foo.new
  for f in foo 
    ...
    #(II)
  end
rescue
  (III)
end

の様になるのですが, (III)から 継続中のforにはいるということはできない
のでしょうか? retryでは, (IV)から再開しになってしまうんですよね...

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

>TeXじゃないんだから(苦笑).
>rubyist(ルビイスト)というのはどうでしょう?

lobbist(ロビイスト)のもじりですか? でも, それだと, 松本氏以外の ruby使
いのことのようですね.

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