青木です。

  In mail "[ruby-list:38080] ポートが閉じているときの例外など"
    Mitsuru Ogino <ogino / verama.net> wrote:

> 荻野と申します。いつも質問や要望ばかりですみません。

(略)

> ですが、ポートが閉じているときは、Invalid argument - "connect(2)"
> (Errno::EINVAL) と表示されます。
> 
>    $ ruby -r net/smtp -e 'Net::SMTP::start("192.168.0.2") { |smtp| }'
>     /usr/local/lib/ruby/1.6/net/protocol.rb:468:in `new': Invalid argument - "connect(2)" (Errno::EINVAL)

これについては他のかたから返事が来てるので省略します。


> もう一つ、比較的小さな要望としましては、サーバが応答しない場合、
> 
>     $ ruby -r net/smtp -e 'Net::SMTP::start("192.168.0.3") { |smtp| }'
>     /usr/local/lib/ruby/1.6/timeout.rb:37:in `connect': execution expired (TimeoutError)
> 	    from /usr/local/lib/ruby/1.6/net/protocol.rb:467:in `timeout'
>     (以下略)
> 
> と TimeoutError が返りますが、これも使用する側で timeout.rb を使用して
> いるときに混乱になりますので、

> と推奨(?)されているように、サブクラスを返していただけると助かるよう
> に思います。(ProtoNoResponseError or ProtoTimeoutOnConnectError とか、
> 読み出し時の TimeoutError と区別できるとなおうれしい…)

これは特に影響もなさそうなので対応しましょう。


> # 個人的には接続時のエラーは ProtocolError のサブクラスの方が使いやす
> # いようにも思うのですが、よくわかりません。

うーん、個人的にはエラーはごっそりまとめて処理しちゃうんで
うまく分類する自信がありません。とりあえず、荻野さんのコードの
例外補足部分を見せていただけたりすると助かるのですが、どうでしょう。
(つまり、どういうことがしたいのかが知りたい)

あと、#finish で IOError を
投げたりしますけど、これも SMTPError なりの下位クラスに変更
すべきだと思いますか?

ちなみに、Proto*Error はまとめて obsolete にするつもりです。
もちろん残しますが、積極的には推奨しません。net/protocol.rb 自体、
そのうち消す予定です。


> しかし grep で require 'timeout' を/usr/local/lib/ruby/1.6/ 以下で検索
> しても、該当する以下の標準添付ライブラリ全部で、特に TimeoutError を補
> 足しているようには見えませんでした。私はなにか勘違いしているのでしょう
> か…

その記述は知りませんでした。


> ついでに、書かせていただくと、添付ライブラリのリファレンスマニュアルに、
> TimeoutError(またはそのサブクラス)があがることが書いてあると、(私の
> ように)さらに timeout で囲ってしまう人が減るかもしれません。

これも対応します。akr さんからは EOFError も書けーと言われてるので
それも書いときます。
-------------------------------------------------------------------
青木峰郎