[解決済み] Ruby Net::HTTPの実行期限が切れた
質問
Net::HTTPを使用して、以下のコードが、アクセスしたURLのウェブサーバーログに対応する応答が迅速に送信されたにもかかわらず、"実行期限切れ"というメッセージでStandardErrorから救出されることが、定期的にあります。 Webサーバーのログが5秒以上かかる応答を示している場合、私は通常、コードがTimeout::Errorから救出されるのを見ます。
以下のコードがStandardErrorで"execution expired"となるのはどのような場合でしょうか。 ではなく Timeout::Errorから救助する?
このコードは、比較的古い Ruby 1.9.3 で、新しいバージョンの Ruby をサポートしていないプラットフォームで、マルチスレッドプログラムで実行されています。 プログラムはマルチスレッドですが、表示されているコードはシングルスレッドでしか動作していません。
begin
connection = Net::HTTP.new(uri.host, uri.port)
connection.open_timeout = 5
connection.read_timeout = 5
connection.start do |http|
request = Net::HTTP::Post.new("/reader_events")
request.body = body
response = http.request(request)
end
rescue StandardError => std_error
log "error sending event to server: #{std_error}"
rescue Timeout::Error => error
log "timeout sending event to server"
end
解決方法は?
これは、どのように
rescue
が動作します。のドキュメントページを見てください。
Exception
クラスがあります。基本的には、一つの例外を継承した例外を多数作成し、その全てを親クラスでrescueを使って処理することができます。
begin
...
rescue Exception => exception
...
end
このコードでは、すべてのタイプの例外を
Exception
がルートです(他の例外はそこから継承されます)。あなたの場合
Timeout::Error
を継承しています。
RuntimeError
を継承し、さらに
StandardError
:
Timeout::Error.ancestors
=> [Timeout::Error, RuntimeError, StandardError, Exception, Object, PP::ObjectMixin, Kernel, BasicObject]
その結果、以下のような感じになっています。
Exception
:
Timeout::Error.new.is_a?(StandardError)
=> true
もうひとつ、あなたの場合、インタプリタがそれぞれの
rescue
ステートメントを上から下へ つまり、最初に
exception
のようなものです。
StandardError
となり、後に以下のように移動します。
rescue
ブロックを作成します。を常にリストする必要があります。
rescue
ブロックは、最も特殊なものから最も一般的なものへと変化します。
の順番を変更します。
rescue
ブロックを使ってコードを修正します。
関連
-
[解決済み】Ruby: 特定のバージョンのruby gemをインストールする方法は?
-
[解決済み] Rubyのswitch文の書き方
-
[解決済み] Rubyで配列に値が存在するかどうかを確認する方法
-
[解決済み] Rubyからシェルコマンドを呼び出す方法
-
[解決済み] Rubyでnilとemptyとblankを理解する方法
-
[解決済み] Rubyで文字列を小文字・大文字に変換する方法
-
[解決済み] Rubyのattr_accessorとは何ですか?
-
[解決済み] Ruby on Railsで現在の絶対URLを取得するにはどうすればよいですか?
-
[解決済み] Rubyのclass << selfイディオム
-
[解決済み] Rubyで「例外 => e」を救済するのはなぜ悪いスタイルなのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] RVM は関数ではないので、'rvm use ...' でルビーを選択してもうまくいきません。
-
[解決済み] Rubyでnil値をマッピングして削除する方法
-
[解決済み] Ruby - 文字列を日付に変換する
-
[解決済み] レイルズ・ジェネレート」を逆手に取る方法
-
[解決済み] Rubyでリフレクション?
-
[解決済み] Ruby の `print` から bash スクリプトを呼び出して echo するにはどうしたらいいですか?
-
[解決済み] ネストされたクラスとモジュールにネストされたクラスはいつ使用するのですか?
-
[解決済み] Rubyで2次元配列の作成と反復処理
-
[解決済み] ルビー.天井と.床
-
[解決済み] Ruby 1.8.7 ハッシュを文字列に変換する