From: Nobuyoshi Nakada Date: 2007-08-20T17:06:03+09:00 Subject: [ruby-dev:31520] Re: setter of $! なかだです。 At Mon, 20 Aug 2007 16:27:20 +0900, SATOH Fumiyasu wrote in [ruby-dev:31518]: > ということで、単に raise すれば自動的に $! が設定されるので、 > (私の考えの範疇では) 直接 $! を書き換える必要はないの > かもれません。 以下の例の範囲ではそう思えます。 > 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 を実行するようにしました。 $!はrescue/ensureを抜けるときに自動的に元の値に復帰されますし、 例外機構とerrnoとの比較は不適切でしょう。 > lib/test/unit/autorunner.rb の process_args() のように > 意図的にエラー情報を隠蔽したりすることもある > (無視したい、表示したくない場合) でしょうし、 > 別のエラーに書き換えたいことは珍しいことでは > ないんじゃないかと思います。 > # Ruby で $! を書き換えられる必要かどうかはさておき 無視するならrescueしたままなにもしない、別のエラーにしたいならそ のエラーをraiseする、というのが素直な方法だと思います。 -- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦