安達@沖データと申します。
#読むのが遅れてまして、鈍亀フォローになるのですが、、、
私も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
|人∧鷲| 沖データ 第一研究所
| <女> | 安達 淳
|牛∨獅|
*------*