From: SATOH Fumiyasu Date: 2007-08-20T16:27:20+09:00 Subject: [ruby-dev:31518] Re: setter of $! さとうふみやす @ OSS テクノロジです。 At Sun, 19 Aug 2007 16:07:42 +0900, SATOH Fumiyasu wrote: > 実例は持っていないですが、IO モジュールのインターフェイスを > 模倣したり (StringIO のようなもの)、IO をラッピング(?) > するようなもの (SSL を扱うモジュールとか) で $! を設定したい > 場合があるんじゃないでしょうか。 そういえば Ruby では $! は整数ではなく Exception クラス(とサブクラス) のインスタンスでしたね…。 ということで、単に raise すれば自動的に $! が設定されるので、 (私の考えの範疇では) 直接 $! を書き換える必要はないの かもれません。 > Perl や C ならそういった例はいくつもあるんじゃないかと > 思います。(IO に限らず)。Ruby は最近始めたばかりで > 詳しくないので、Ruby にもあてはまるかどうかは私には > わかりませんが。:-X At Sun, 19 Aug 2007 17:43:45 +0900, SASADA Koichi wrote: >  私は Perl (や C)を良く知らないので、具体的にどんな話か教えてもら > えないでしょうか。 時間もなく良い例が思いつかないので、(ちょっと違うような 気もしますが)最近遭遇した実例で。 OpenLDAP のライブラリに含まれる ldap_open(3) は、 マニュアルには「失敗したときに NULL を返してerrno を設定 する」と記述されているのですが、ある条件のとき失敗して NULL を返すのですが、errno を設定しないことがあります。 それだけならまだいい(?)のですが、ldap_open(3) を呼ぶ前に errno が 0 以外に設定されていることがあり、 ldap_open(3) が失敗する問題を調査する際に 混乱の元になることがありました。(errno が ldap_open(3) の 失敗理由を示していないので) この混乱を避けるために ldap_open(3) を呼ぶ前に errno = 0 を実行するようにしました。 … lib/test/unit/autorunner.rb の process_args() のように 意図的にエラー情報を隠蔽したりすることもある (無視したい、表示したくない場合) でしょうし、 別のエラーに書き換えたいことは珍しいことでは ないんじゃないかと思います。 # Ruby で $! を書き換えられる必要かどうかはさておき -- -- Name: SATOH Fumiyasu / fumiyas @ osstech.co.jp -- Business Home: http://www.OSSTech.co.jp -- Personal Home: http://www.SFO.jp/blog/