青木です。

  In mail "[ruby-list:38113] Re: ポートが閉じているときの例外など"
    Mitsuru Ogino <ogino / verama.net> 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 のサブクラスも作りますかね。
-------------------------------------------------------------------
青木峰郎