2011-08-24 18 views
8

Tôi đang cố gắng xử lý nội dung từ danh sách liên kết bằng cách sử dụng "open-uri" trong ruby ​​(1.8.6), nhưng điều xấu xảy ra khi tôi nhận được một lỗi khi một liên kết bị hỏng hoặc yêu cầu xác thực:cách kiểm tra url mở uri tồn tại trước khi xử lý bất kỳ dữ liệu nào

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' 

hoặc

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' 

hoặc

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' 

là có một cách để kiểm tra đáp ứng (url) trước khi xử lý bất kỳ dữ liệu nào?

mã là:

require 'open-uri' 

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

Rất cám ơn

Trả lời

23

Bạn có thể thử một cái gì đó dọc theo dòng của

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 

Tôi không biết cách nào để kiểm tra các kết nối mà không cần mở nó và cố gắng, do đó, cứu các lỗi này sẽ là cách duy nhất tôi có thể nghĩ đến. Điều cần lưu ý là OpenURI :: HTTPError và SocketError là cả hai lớp con của StandardError, trong khi Errno :: ECONNRESET là một lớp con của SystemCallError. Vì vậy, cứu => e sẽ không bắt Errno :: ECONNRESET.

0

tôi đã có thể giải quyết vấn đề này bằng cách sử dụng một điều kiện nếu/else để kiểm tra giá trị trả về của hành động cho "thất bại":

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

này không bắt lỗi 'SocketError (Không thể mở Kết nối TCP tới jsonipsdf.com:443 (getaddrinfo: nodename và servname được cung cấp, hoặc không được biết)): ' – Whitecat

Các vấn đề liên quan