Net :: HTTPを使用して、以下のコードが、アクセスされたURLからのWebサーバーログが対応するURLを表示しているにもかかわらず、「実行期限切れ」のメッセージでStandardErrorから救済されます応答がすぐに送信されました。 Webサーバーのログに5秒以上かかる応答が表示されると、通常、Timeout :: Errorのコードレスキューが表示されます。Ruby Net :: HTTP実行の有効期限が切れました
以下のコードは、タイムアウト::エラーから救済されたの代わりに、 "実行期限切れ"のでStandardErrorからレスキューすることができますか?
このコードは、Rubyの新しいバージョンをサポートしていない比較的古くからのRuby 1.9.3のマルチスレッドプログラムで実行されています。プログラムはマルチスレッドですが、表示されるコードは単一のスレッド上でのみ実行されます。
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
他のレスキューブロックの前に 'レスキューTimeout :: Error'ブロックを置いてみてください。 Rubyでは、ほとんどの例外クラスはStandardErrorから継承しているので、Timeout :: Errorも同様です。その場合、エラーは一種のStandardErrorと一種のTimeout :: Errorの両方になります。そして、最初にマッチした 'rescue'ハンドラが勝ちます。 –
@HenrikN良いキャッチ。 'Timeout :: Error.ancestors'は' StandardError'を継承しています。 – Casper