安達@沖データと申します。

#読むのが遅れてまして、鈍亀フォローになるのですが、、、

私もbegin .. rescue .. endを始めて見た時に、
「『勝手に終了する分には、気にしない』という使い方の時は良いけれど、
  ある程度チェックしようとすると面倒臭いかなぁ。完全にチェックしたい場
  合には、これで何も問題ないんだけれど。Unixのシグナル関数のように事前
  登録性にできたらよいのに」
と思っていました。

それで、下のようなコードを書いてみたけれど動かないんで、それきり忘れて
いました。

#まぁ、動かないコードですから色んな意味で勘違いが入っていると思います
#が、意図を読み取って下さい。(_O_)
--
#!/usr/local/bin/ruby

=begin
この定義は標準のクラス定義の一部になって欲しい
=end
class File
  @error_handlers =
    {'open' => { Errno::ENOTDIR => Errno::ENOTDIR,
(略)
                 Errno::EINVAL => Errno::EINVAL }}

  def handler (method, errno)
    (@error_handlers[method])[errno]
  end

  alias original_open open
  def open (path, mode="rw")
    begin
      original_open(path, mode)
    rescue Errno::ENOENT
      h = handler('open', Errno::ENOENT)
      if (h.is_a(Proc)) then
        h.call
      else
        h
      end
    end
  end
end

=begin
これ以降は、ユーザが自分で書きたい
=end

class ErrorObject < Object
  def to_i
    0
  end
end

File.handler('open', Errno::ENOENT) = ErrorObject.new

counter = File.open("henoheno").to_i
print "counter = #{counter}\n"
--

このコードを書きながら、「欲しいなぁー」と思った機能は、次の二つです。

(1) ユーザが定義可能なエラーハンドラー辞書と標準クラスからの呼出し。
  さらに贅沢を言うと、PostScriptの辞書みたいにスタッカブルになっている
  と、以前の状態に簡単に戻れるのでうれしい。

(2) 単独のrescue節で複数のエラーを処理できるように、現在捕まえているエ
  ラーオブジェクトを仮引数で受け取りたい。

#こっちは、私が知らないだけで(仮引数でない形では)できるんじゃないかと
#思うのですが、、、

CGIの件だとこんなので対応できるんじゃないかと思うんですが、やっぱり演
算子の方がよいんでしょうか?>最初のメールの方(もりきゅうさん???)

その場で毎回書かないといけない現行方式や演算子形式よりも、こちらの方が
サボれるんではないかと思いますが、いかがでしょう?これであれば、別に新
しい識別子を導入するわけでもないですし。
--
*------*				adachi / okidata.co.jp
|人∧鷲|				沖データ 第一研究所
| <女> |				安達 淳
|牛∨獅|
*------*