【发布时间】:2017-02-20 11:43:44
【问题描述】:
所以,我正在创建一个检查工具运行状况检查的脚本,该脚本首先要做的是检查它是否能够真正到达指定的 URL(通过检查 HTTP 代码)。我遇到了一个问题,如果 URL 无效,它会导致 SocketError - getaddrinfo: nodename nor servname provided, or not known 引发 Internal Server error (500)(这是可以理解的)..
但不是那样,我想处理那个错误,而是向用户返回一个自定义的“错误”。
在发布此问题之前,我已经在谷歌上搜索了很长一段时间的解决方案,但我找不到任何对我的问题有用的东西。 :/
我的脚本正在使用 Sinatra,这是与此问题有关的主要部分:
def check_status(uri_str, is_verbose, limit = 10)
response = RestClient.get "#{uri_str}" # This is line 35
case response.code
when 200...300
@@services.each do |service|
if service.is_matched?("#{uri_str}")
@@tool_name = service.class.name.split('::').last.downcase
puts "This is the URL inside the 'if
@@result = service.check_tool_specific("#{uri_str}", "#{verbose(is_verbose)}")
end
end
if @@result.nil?
return 'No results, something went wrong!'
end
return "{\"#{@@tool_name}\":{\"timestamp\":\"#{Time.now.strftime('%Y-%m-%d %T')}\",\"results\":#{@@result.to_json}}}"
when Net::HTTPRedirection then
puts "Response code in Net::HTTPRedirection: #{response.code}"
location = response['location']
check_status(location, limit - 1)
else
puts "It doesn't work!"
puts "#{response.code}"
end
end
目前,如果 URL 无效,这是我在控制台中收到的错误:
2016-10-11 15:46:32 - SocketError - getaddrinfo: nodename nor servname provided, or not known:
/Users/farahfa/.rvm/rubies/ruby-2.2.2/lib/ruby/2.2.0/net/http.rb:879:in `initialize'
/Users/farahfa/.rvm/rubies/ruby-2.2.2/lib/ruby/2.2.0/net/http.rb:879:in `open'
/Users/farahfa/.rvm/rubies/ruby-2.2.2/lib/ruby/2.2.0/net/http.rb:879:in `block in connect'
/Users/farahfa/.rvm/rubies/ruby-2.2.2/lib/ruby/2.2.0/timeout.rb:74:in `timeout'
/Users/farahfa/.rvm/rubies/ruby-2.2.2/lib/ruby/2.2.0/net/http.rb:878:in `connect'
/Users/farahfa/.rvm/rubies/ruby-2.2.2/lib/ruby/2.2.0/net/http.rb:863:in `do_start'
/Users/farahfa/.rvm/rubies/ruby-2.2.2/lib/ruby/2.2.0/net/http.rb:852:in `start'
/Users/farahfa/.rvm/gems/ruby-2.2.2@global/gems/rest-client-2.0.0/lib/restclient/request.rb:766:in `transmit'
/Users/farahfa/.rvm/gems/ruby-2.2.2@global/gems/rest-client-2.0.0/lib/restclient/request.rb:215:in `execute'
/Users/farahfa/.rvm/gems/ruby-2.2.2@global/gems/rest-client-2.0.0/lib/restclient/request.rb:52:in `execute'
/Users/farahfa/.rvm/gems/ruby-2.2.2@global/gems/rest-client-2.0.0/lib/restclient.rb:67:in `get'
/Users/farahfa/temp/ruby-devtools-hc/devtools-hc.rb:35:in `check_status'
/Users/farahfa/temp/ruby-devtools-hc/devtools-hc.rb:22:in `block in <class:DevMonit>'
/Users/farahfa/.rvm/gems/ruby-2.2.2@global/gems/sinatra-1.4.7/lib/sinatra/base.rb:1611:in `call'
/Users/farahfa/.rvm/gems/ruby-2.2.2@global/gems/sinatra-1.4.7/lib/sinatra/base.rb:1611:in `block in compile!'
/Users/farahfa/.rvm/gems/ruby-2.2.2@global/gems/sinatra-1.4.7/lib/sinatra/base.rb:975:in `[]'
/Users/farahfa/.rvm/gems/ruby-2.2.2@global/gems/sinatra-1.4.7/lib/sinatra/base.rb:975:in `block (3 levels) in route!'
/Users/farahfa/.rvm/gems/ruby-2.2.2@global/gems/sinatra-1.4.7/lib/sinatra/base.rb:994:in `route_eval'
/Users/farahfa/.rvm/gems/ruby-2.2.2@global/gems/sinatra-1.4.7/lib/sinatra/base.rb:975:in `block (2 levels) in route!'
/Users/farahfa/.rvm/gems/ruby-2.2.2@global/gems/sinatra-1.4.7/lib/sinatra/base.rb:1015:in `block in process_route'
/Users/farahfa/.rvm/gems/ruby-2.2.2@global/gems/sinatra-1.4.7/lib/sinatra/base.rb:1013:in `catch'
/Users/farahfa/.rvm/gems/ruby-2.2.2@global/gems/sinatra-1.4.7/lib/sinatra/base.rb:1013:in `process_route'
/Users/farahfa/.rvm/gems/ruby-2.2.2@global/gems/sinatra-1.4.7/lib/sinatra/base.rb:973:in `block in route!'
/Users/farahfa/.rvm/gems/ruby-2.2.2@global/gems/sinatra-1.4.7/lib/sinatra/base.rb:972:in `each'
/Users/farahfa/.rvm/gems/ruby-2.2.2@global/gems/sinatra-1.4.7/lib/sinatra/base.rb:972:in `route!'
/Users/farahfa/.rvm/gems/ruby-2.2.2@global/gems/sinatra-1.4.7/lib/sinatra/base.rb:1085:in `block in dispatch!'
/Users/farahfa/.rvm/gems/ruby-2.2.2@global/gems/sinatra-1.4.7/lib/sinatra/base.rb:1067:in `block in invoke'
/Users/farahfa/.rvm/gems/ruby-2.2.2@global/gems/sinatra-1.4.7/lib/sinatra/base.rb:1067:in `catch'
/Users/farahfa/.rvm/gems/ruby-2.2.2@global/gems/sinatra-1.4.7/lib/sinatra/base.rb:1067:in `invoke'
/Users/farahfa/.rvm/gems/ruby-2.2.2@global/gems/sinatra-1.4.7/lib/sinatra/base.rb:1082:in `dispatch!'
/Users/farahfa/.rvm/gems/ruby-2.2.2@global/gems/sinatra-1.4.7/lib/sinatra/base.rb:907:in `block in call!'
/Users/farahfa/.rvm/gems/ruby-2.2.2@global/gems/sinatra-1.4.7/lib/sinatra/base.rb:1067:in `block in invoke'
/Users/farahfa/.rvm/gems/ruby-2.2.2@global/gems/sinatra-1.4.7/lib/sinatra/base.rb:1067:in `catch'
/Users/farahfa/.rvm/gems/ruby-2.2.2@global/gems/sinatra-1.4.7/lib/sinatra/base.rb:1067:in `invoke'
/Users/farahfa/.rvm/gems/ruby-2.2.2@global/gems/sinatra-1.4.7/lib/sinatra/base.rb:907:in `call!'
/Users/farahfa/.rvm/gems/ruby-2.2.2@global/gems/sinatra-1.4.7/lib/sinatra/base.rb:895:in `call'
/Users/farahfa/.rvm/gems/ruby-2.2.2@global/gems/rack-protection-1.5.3/lib/rack/protection/xss_header.rb:18:in `call'
/Users/farahfa/.rvm/gems/ruby-2.2.2@global/gems/rack-protection-1.5.3/lib/rack/protection/path_traversal.rb:16:in `call'
/Users/farahfa/.rvm/gems/ruby-2.2.2@global/gems/rack-protection-1.5.3/lib/rack/protection/json_csrf.rb:18:in `call'
/Users/farahfa/.rvm/gems/ruby-2.2.2@global/gems/rack-protection-1.5.3/lib/rack/protection/base.rb:49:in `call'
/Users/farahfa/.rvm/gems/ruby-2.2.2@global/gems/rack-protection-1.5.3/lib/rack/protection/base.rb:49:in `call'
/Users/farahfa/.rvm/gems/ruby-2.2.2@global/gems/rack-protection-1.5.3/lib/rack/protection/frame_options.rb:31:in `call'
/Users/farahfa/.rvm/gems/ruby-2.2.2@global/gems/rack-1.6.4/lib/rack/nulllogger.rb:9:in `call'
/Users/farahfa/.rvm/gems/ruby-2.2.2@global/gems/rack-1.6.4/lib/rack/head.rb:13:in `call'
/Users/farahfa/.rvm/gems/ruby-2.2.2@global/gems/sinatra-1.4.7/lib/sinatra/show_exceptions.rb:25:in `call'
/Users/farahfa/.rvm/gems/ruby-2.2.2@global/gems/sinatra-1.4.7/lib/sinatra/base.rb:182:in `call'
/Users/farahfa/.rvm/gems/ruby-2.2.2@global/gems/sinatra-1.4.7/lib/sinatra/base.rb:2013:in `call'
/Users/farahfa/.rvm/gems/ruby-2.2.2@global/gems/sinatra-1.4.7/lib/sinatra/base.rb:1487:in `block in call'
/Users/farahfa/.rvm/gems/ruby-2.2.2@global/gems/sinatra-1.4.7/lib/sinatra/base.rb:1787:in `synchronize'
/Users/farahfa/.rvm/gems/ruby-2.2.2@global/gems/sinatra-1.4.7/lib/sinatra/base.rb:1487:in `call'
/Users/farahfa/.rvm/gems/ruby-2.2.2@global/gems/rack-1.6.4/lib/rack/tempfile_reaper.rb:15:in `call'
/Users/farahfa/.rvm/gems/ruby-2.2.2@global/gems/rack-1.6.4/lib/rack/lint.rb:49:in `_call'
/Users/farahfa/.rvm/gems/ruby-2.2.2@global/gems/rack-1.6.4/lib/rack/lint.rb:37:in `call'
/Users/farahfa/.rvm/gems/ruby-2.2.2@global/gems/rack-1.6.4/lib/rack/showexceptions.rb:24:in `call'
/Users/farahfa/.rvm/gems/ruby-2.2.2@global/gems/rack-1.6.4/lib/rack/commonlogger.rb:33:in `call'
/Users/farahfa/.rvm/gems/ruby-2.2.2@global/gems/sinatra-1.4.7/lib/sinatra/base.rb:219:in `call'
/Users/farahfa/.rvm/gems/ruby-2.2.2@global/gems/rack-1.6.4/lib/rack/chunked.rb:54:in `call'
/Users/farahfa/.rvm/gems/ruby-2.2.2@global/gems/rack-1.6.4/lib/rack/content_length.rb:15:in `call'
/Users/farahfa/.rvm/gems/ruby-2.2.2@global/gems/rack-1.6.4/lib/rack/handler/webrick.rb:88:in `service'
/Users/farahfa/.rvm/rubies/ruby-2.2.2/lib/ruby/2.2.0/webrick/httpserver.rb:138:in `service'
/Users/farahfa/.rvm/rubies/ruby-2.2.2/lib/ruby/2.2.0/webrick/httpserver.rb:94:in `run'
/Users/farahfa/.rvm/rubies/ruby-2.2.2/lib/ruby/2.2.0/webrick/server.rb:294:in `block in start_thread'
注意:22 行就是:check_status(url, is_verbose),它调用了函数。
非常感谢任何帮助和/或指导!
【问题讨论】:
-
在您的方法中
end之前添加rescue SocketError => e; #do something with e.message应该这样做,#do something with e.message应该替换为您的逻辑以向用户返回一些合理的内容还阅读 ruby 中的处理异常rubylearning.com/satishtalim/ruby_exceptions.html -
啊,没想到.. SocketError 是否返回任何类型的 HTTP 代码?我的想法是,如果我的脚本无法访问 URL,那么它将在 JSON 对象中返回 HTTP 代码,在这种情况下可以这样做吗?
-
该错误意味着它无法解析主机名,因此它永远不会离开客户端,也没有返回的 HTTP 代码
-
啊!这是有道理的。
标签: ruby sinatra httpresponse net-http