From: Minero Aoki Date: 2003-08-16T21:59:53+09:00 Subject: [ruby-list:38131] Re: ポートが閉じているときの例外など 青木です。 In mail "[ruby-list:38113] Re: ポートが閉じているときの例外など" Mitsuru Ogino wrote: > 荻野です。お騒がせしています。 > > ちなみに、Proto*Error はまとめて obsolete にするつもりです。 > 今から obsolete になるのであれば、ProtoTimeoutOnConnectError(長い…) > などの名前を増やすべきではない、ということでしょうか。 はい。 > なぜ非推奨になるのか、教えていただけないでしょうか。Proto という名前が > 適切かどうかはともかく、TCP 層のエラーを、アプリケーション層にまとめる > という意味であれば、ちょっとそれは違和感を覚えます。IO や Socket レベル > のエラーに統一するというのであれば、賛成できると思います。 いまは SMTP と POP と HTTP のエラーが全部 ProtocolError から 派生してるんですが、これをあるべき姿に直そうっていうだけです。 StandardError ProtocolError ProtoXXXError ↓ StandardError SMTPError SMTPXXXXError POPError POPXXXXError HTTPError HTTPXXXXError というふうに。コネクション関係のエラーは元々 Proto*Error には 入れてないので関係ありません。 > > あと、#finish で IOError を > > 投げたりしますけど、これも SMTPError なりの下位クラスに変更 > > すべきだと思いますか? > > かなり汎用的な(呼び出し側でも使いそうな)TimeoutError と違って IO を使って > いて、IOError を返すというのは、それはそれなりに筋が通っていると思います。 > > というか #finish が IOError(かそのサブクラス)を返すのであれば、接続失敗 > (相手が応答しなくて TimeoutError になった場合を含む)でも IOError などの > 下位層のエラーだとわかる方が、SMTP のエラー(5xx)や POP3 のエラー(-ERR) > とかと区別できてすっきりする、というのが私の感覚です。 それは同意します。しかし多重継承が存在しない以上 TimeoutError と IOError を同時に継承することができません。そうすると、open 時の タイムアウトはどちらかにしなければならないのですよね。 > # しかし、IOError で送信を確認すべしというのは、リファレンスマニュアルにな > # かったので、気がつきませんでした。 確か、CVS HEAD の英語マニュアルには書いたんですよ。 日本語マニュアルは更新が面倒で……。 > Proto*Error というのが、SMTPError とかと同類項(アプリケーション層のエラー) > というのであれば、「接続時のエラーは ProtocolError のサブクラスの方が」と > いうのは撤回します。趣旨は、アプリケーション層のエラーと下の層のエラーは > 分かれていた方がいいということです。 この点も同意します。 > 逆に、TCP や socket のレベルで接続に失敗した場合の例外が SMTP とか POP3 とか > で個別に定義されていると、それはそれでリファレンスをみる回数が増えてちょっと > 躊躇します。が、リファレンスマニュアルに書いてあればそれはそれで受け入れられ > ることかと。 従って、こういうことをするつもりはありません。 > で、SMTP とかで接続が成功したとき後の読み出しの timeout だけが、ちょっと異質 > な感じですね。SessionTimeoutError とかにしても、実質は IOError のサブクラスで > あるべきように感じます。(しかし互換性の問題があるので変えるべきではないでと > は思います) そうですねえ。これはちょっと解決策を思い付きません。 当面は、コネクション関係は IOError TimeoutError Errno::E*、 それより上のエラーは Net::HTTPError を拾え、ということにしましょう。 いちおう TimeoutError のサブクラスも作りますかね。 ------------------------------------------------------------------- 青木峰郎