2011-08-24 8 views
8

ruby​​(1.8.6)で "open-uri"を使用してリンクのリストからコンテンツを処理しようとしていますが、 1つのリンクが壊れているか、認証を必要とするときにエラーを取得:データを処理する前にopen-uri urlをテストする方法

open-uri.rb:277:in `open_http': 404 Not Found (OpenURI::HTTPError) 
from C:/tools/Ruby/lib/ruby/1.8/open-uri.rb:616:in `buffer_open' 
from C:/tools/Ruby/lib/ruby/1.8/open-uri.rb:164:in `open_loop' 
from C:/tools/Ruby/lib/ruby/1.8/open-uri.rb:162:in `catch' 

または

C:/tools/Ruby/lib/ruby/1.8/net/http.rb:560:in `initialize': getaddrinfo: no address associated with hostname. (SocketError) 
from C:/tools/Ruby/lib/ruby/1.8/net/http.rb:560:in `open' 
from C:/tools/Ruby/lib/ruby/1.8/net/http.rb:560:in `connect' 
from C:/tools/Ruby/lib/ruby/1.8/timeout.rb:53:in `timeout' 

または

C:/tools/Ruby/lib/ruby/1.8/net/protocol.rb:133:in `sysread': An existing connection was forcibly closed by the remote host. (Errno::ECONNRESET) 
from C:/tools/Ruby/lib/ruby/1.8/net/protocol.rb:133:in `rbuf_fill' 
from C:/tools/Ruby/lib/ruby/1.8/timeout.rb:62:in `timeout' 
from C:/tools/Ruby/lib/ruby/1.8/timeout.rb:93:in `timeout' 

をテストする方法がありますデータを処理する前のレスポンス(URL)?

コードは次のとおりです。

require 'open-uri' 

smth.css.each do |item| 
open('item[:name]', 'wb') do |file| 
    file << open('item[:href]').read 
end 
end 

感謝

答えて

23

私は開くことなく、接続をテストするのいずれかの方法を知っていない

require 'open-uri' 

    smth.css.each do |item| 
    begin 
     open('item[:name]', 'wb') do |file| 
     file << open('item[:href]').read 
     end 
    rescue => e 
     case e 
     when OpenURI::HTTPError 
     # do something 
     when SocketError 
     # do something else 
     else 
     raise e 
     end 
     rescue SystemCallError => e 
     if e === Errno::ECONNRESET 
     # do something else 
     else 
     raise e 
     end 
    end 
    end 

の線に沿って何かを試みることができますそれを試してみると、これらのエラーを救済することが、私が考えることができる唯一の方法になります。注意すべき点は、OpenURI :: HTTPErrorとSocketErrorは両方ともStandardErrorのサブクラスであるのに対し、Errno :: ECONNRESETはSystemCallErrorのサブクラスです。だからレスキュー=> eはErrno :: ECONNRESETを捕まえません。

0

私は「失敗」のアクションの戻り値をチェックするための条件のif/else文を使用することで、この問題を解決することができました:

def controller_action 
    url = "some_API" 
    response = open(url).read 
    data = JSON.parse(response)["data"] 
    if response["status"] == "failure" 
     redirect_to :action => "home" 
    else 
     do_something_else 
    end 
end 
+0

これは 'SocketErrorは(オープンに失敗しましたエラーをキャッチしません。 jsonipsdf.com:443へのTCP接続(getaddrinfo:提供されているノード名もservnameも提供されていない)): '' – Whitecat

関連する問題