From: Wakou Aoyama Date: 2000-05-17T22:37:03+09:00 Subject: [ruby-list:22693] Re: about net/telnet.rb 青山です。 On Wed, 17 May 2000 17:24:42 +0900, goto@yokogawa-kouji.co.jp wrote: > ありがとうございます。timed-out した後の処理をrescue以下で行えば > よいのですね。 あ、timeout の場合は TimeoutError です。 begin telnet.cmd(" /sbin/shutdown -h now ") rescue Errno::ECONNRESET # Connection reset by peer rescue TimeoutError end ですが、このように cmd の出力も利用していない場合には、わざわざプロン プトを待ってエラーを得る必要もないでしょうから、print にしてしまうとい う手もありかもしれません。 telnet.print(" /sbin/shutdown -h now ") > rescue文を書くとき、このエラーの種類をどうするのか、いつも疑問 > に思っています。 > 何か一覧できるような資料が欲しいです。 www.ruby-lang.org にあるオンラインのリファレンスマニュアルには一通りあ ります。しかし、timeout.rb のようなライブラリまではありませんし(という か、そこまで一覧にするのは無理でしょう)、探すのも面倒なので、私の場合 はエラーが起きた所で、エラーメッセージを見て対応しています。 $ ruby -rtimeout -e 'timeout(1){sleep 3}' /usr/local/lib/ruby/1.5/timeout.rb:36: execution expired (TimeoutError) from -e:1:in `timeout' from -e:1 ちなみに、NIFTY へのアクセスツールでの経験では、ソケット関連では大体次 の2つを捕捉しておけば大丈夫のようです。 Errno::ECONNREFUSED (Connection refused) Errno::ECONNRESET (Connection reset by peer) telnet.rb の場合は TimeoutError も発生するので、組合せとしてはこんな感 じです。 begin # 接続およびログイン処理。 rescue Errno::ECONNREFUSED # Connection refused # 接続が拒否された場合。 retry # などとすると便利。sleep を少し入れてから retry もいいかも。 rescue Errno::ECONNRESET # Connection reset by peer # 読み(書き)込み中に切断された場合。 retry # などとすると便利。sleep を少し入れてから retry もいいかも。 rescue TimeoutError # 期待した時間内に処理が終らなかった場合。 retry # などとすると便利。sleep を少し入れてから retry もいいかも。 rescue # その他の一般的な例外が発生した場合。 end begin # 読み(書き)込み処理。 rescue TimeoutError # 期待した時間内に処理が終らなかった場合。 rescue # その他の一般的な例外が発生した場合。 end begin # ログアウト処理など、途中で切断される可能性のある読み(書き)込み処理。 rescue Errno::ECONNRESET # Connection reset by peer # 読み(書き)込み中に切断された場合。 rescue TimeoutError # 期待した時間内に処理が終らなかった場合。 rescue # その他の一般的な例外が発生した場合。 end -- 青山 和光 Wakou Aoyama