2016-10-11 6 views
0

ツールの正常性チェックをチェックするスクリプトを作成しています。最初に指定されたURLまたは指定されていないURLにアクセスします(HTTPコードをチェックします)。私はURLが無効な場合、Internal Server error (500)(わかりやすい)を返すが発生する問題があります。SocketErrorの処理方法 - getaddrinfo:提供されているノード名もservnameもありません。[ruby]

しかし、その代わりに、私はそのエラーを処理したい代わりにカスタム "エラー"ユーザに提供する。

これを投稿する前に、私はかなりの間、この問題の解決方法を探していましたが、問題に役立つものは何も見つかりませんでした。 :/私のスクリプトは、シナトラを使用しており、これは、この問題に関係している主要な部分である

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/[email protected]/gems/rest-client-2.0.0/lib/restclient/request.rb:766:in `transmit' 
    /Users/farahfa/.rvm/gems/[email protected]/gems/rest-client-2.0.0/lib/restclient/request.rb:215:in `execute' 
    /Users/farahfa/.rvm/gems/[email protected]/gems/rest-client-2.0.0/lib/restclient/request.rb:52:in `execute' 
    /Users/farahfa/.rvm/gems/[email protected]/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/[email protected]/gems/sinatra-1.4.7/lib/sinatra/base.rb:1611:in `call' 
    /Users/farahfa/.rvm/gems/[email protected]/gems/sinatra-1.4.7/lib/sinatra/base.rb:1611:in `block in compile!' 
    /Users/farahfa/.rvm/gems/[email protected]/gems/sinatra-1.4.7/lib/sinatra/base.rb:975:in `[]' 
    /Users/farahfa/.rvm/gems/[email protected]/gems/sinatra-1.4.7/lib/sinatra/base.rb:975:in `block (3 levels) in route!' 
    /Users/farahfa/.rvm/gems/[email protected]/gems/sinatra-1.4.7/lib/sinatra/base.rb:994:in `route_eval' 
    /Users/farahfa/.rvm/gems/[email protected]/gems/sinatra-1.4.7/lib/sinatra/base.rb:975:in `block (2 levels) in route!' 
    /Users/farahfa/.rvm/gems/[email protected]/gems/sinatra-1.4.7/lib/sinatra/base.rb:1015:in `block in process_route' 
    /Users/farahfa/.rvm/gems/[email protected]/gems/sinatra-1.4.7/lib/sinatra/base.rb:1013:in `catch' 
    /Users/farahfa/.rvm/gems/[email protected]/gems/sinatra-1.4.7/lib/sinatra/base.rb:1013:in `process_route' 
    /Users/farahfa/.rvm/gems/[email protected]/gems/sinatra-1.4.7/lib/sinatra/base.rb:973:in `block in route!' 
    /Users/farahfa/.rvm/gems/[email protected]/gems/sinatra-1.4.7/lib/sinatra/base.rb:972:in `each' 
    /Users/farahfa/.rvm/gems/[email protected]/gems/sinatra-1.4.7/lib/sinatra/base.rb:972:in `route!' 
    /Users/farahfa/.rvm/gems/[email protected]/gems/sinatra-1.4.7/lib/sinatra/base.rb:1085:in `block in dispatch!' 
    /Users/farahfa/.rvm/gems/[email protected]/gems/sinatra-1.4.7/lib/sinatra/base.rb:1067:in `block in invoke' 
    /Users/farahfa/.rvm/gems/[email protected]/gems/sinatra-1.4.7/lib/sinatra/base.rb:1067:in `catch' 
    /Users/farahfa/.rvm/gems/[email protected]/gems/sinatra-1.4.7/lib/sinatra/base.rb:1067:in `invoke' 
    /Users/farahfa/.rvm/gems/[email protected]/gems/sinatra-1.4.7/lib/sinatra/base.rb:1082:in `dispatch!' 
    /Users/farahfa/.rvm/gems/[email protected]/gems/sinatra-1.4.7/lib/sinatra/base.rb:907:in `block in call!' 
    /Users/farahfa/.rvm/gems/[email protected]/gems/sinatra-1.4.7/lib/sinatra/base.rb:1067:in `block in invoke' 
    /Users/farahfa/.rvm/gems/[email protected]/gems/sinatra-1.4.7/lib/sinatra/base.rb:1067:in `catch' 
    /Users/farahfa/.rvm/gems/[email protected]/gems/sinatra-1.4.7/lib/sinatra/base.rb:1067:in `invoke' 
    /Users/farahfa/.rvm/gems/[email protected]/gems/sinatra-1.4.7/lib/sinatra/base.rb:907:in `call!' 
    /Users/farahfa/.rvm/gems/[email protected]/gems/sinatra-1.4.7/lib/sinatra/base.rb:895:in `call' 
    /Users/farahfa/.rvm/gems/[email protected]/gems/rack-protection-1.5.3/lib/rack/protection/xss_header.rb:18:in `call' 
    /Users/farahfa/.rvm/gems/[email protected]/gems/rack-protection-1.5.3/lib/rack/protection/path_traversal.rb:16:in `call' 
    /Users/farahfa/.rvm/gems/[email protected]/gems/rack-protection-1.5.3/lib/rack/protection/json_csrf.rb:18:in `call' 
    /Users/farahfa/.rvm/gems/[email protected]/gems/rack-protection-1.5.3/lib/rack/protection/base.rb:49:in `call' 
    /Users/farahfa/.rvm/gems/[email protected]/gems/rack-protection-1.5.3/lib/rack/protection/base.rb:49:in `call' 
    /Users/farahfa/.rvm/gems/[email protected]/gems/rack-protection-1.5.3/lib/rack/protection/frame_options.rb:31:in `call' 
    /Users/farahfa/.rvm/gems/[email protected]/gems/rack-1.6.4/lib/rack/nulllogger.rb:9:in `call' 
    /Users/farahfa/.rvm/gems/[email protected]/gems/rack-1.6.4/lib/rack/head.rb:13:in `call' 
    /Users/farahfa/.rvm/gems/[email protected]/gems/sinatra-1.4.7/lib/sinatra/show_exceptions.rb:25:in `call' 
    /Users/farahfa/.rvm/gems/[email protected]/gems/sinatra-1.4.7/lib/sinatra/base.rb:182:in `call' 
    /Users/farahfa/.rvm/gems/[email protected]/gems/sinatra-1.4.7/lib/sinatra/base.rb:2013:in `call' 
    /Users/farahfa/.rvm/gems/[email protected]/gems/sinatra-1.4.7/lib/sinatra/base.rb:1487:in `block in call' 
    /Users/farahfa/.rvm/gems/[email protected]/gems/sinatra-1.4.7/lib/sinatra/base.rb:1787:in `synchronize' 
    /Users/farahfa/.rvm/gems/[email protected]/gems/sinatra-1.4.7/lib/sinatra/base.rb:1487:in `call' 
    /Users/farahfa/.rvm/gems/[email protected]/gems/rack-1.6.4/lib/rack/tempfile_reaper.rb:15:in `call' 
    /Users/farahfa/.rvm/gems/[email protected]/gems/rack-1.6.4/lib/rack/lint.rb:49:in `_call' 
    /Users/farahfa/.rvm/gems/[email protected]/gems/rack-1.6.4/lib/rack/lint.rb:37:in `call' 
    /Users/farahfa/.rvm/gems/[email protected]/gems/rack-1.6.4/lib/rack/showexceptions.rb:24:in `call' 
    /Users/farahfa/.rvm/gems/[email protected]/gems/rack-1.6.4/lib/rack/commonlogger.rb:33:in `call' 
    /Users/farahfa/.rvm/gems/[email protected]/gems/sinatra-1.4.7/lib/sinatra/base.rb:219:in `call' 
    /Users/farahfa/.rvm/gems/[email protected]/gems/rack-1.6.4/lib/rack/chunked.rb:54:in `call' 
    /Users/farahfa/.rvm/gems/[email protected]/gems/rack-1.6.4/lib/rack/content_length.rb:15:in `call' 
    /Users/farahfa/.rvm/gems/[email protected]/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)関数を呼び出しています。

ご協力いただきありがとうございます。

+1

追加 'レスキューSocketError => e;あなたのメソッドで 'end'の前にe.message'を使って何かを行います。そうする必要があります。' #e something with e.message'はあなたのロジックに置き換えて、ユーザーに賢明なものを返すべきです。 ://rubylearning.com/satishtalim/ruby_exceptions.html – bjhaid

+0

ああ、それについて考えることはありません.. SocketErrorはどんな種類のHTTPコードを返しますか?私の考えは、スクリプトがURLに到達できない場合、JSONオブジェクトにHTTPコードを返します。この場合、これを行うことができますか? – Fadi

+1

そのエラーは、ホスト名を解決できないことを意味します。したがって、クライアントに返信するHTTPコードはありません。 – bjhaid

答えて

0

RestClientのバージョン2を使用しているので、あなたのメソッドでendの前にrescue RestClient::ExceptionWithResponse => e #do何かをe.responseで追加することをお勧めします。

RestClientがここで発生させることができるすべての例外の完全なリストは、https://github.com/rest-client/rest-client#exceptions-see-httpwwww3orgprotocolsrfc2616rfc2616-sec10htmlです。

私はすべてをキャッチしようとお勧めします:)

+0

これは 'ArgumentError - 引数の数が間違っています(0のための0)' – Fadi

+0

編集された答えです。メソッドの最後にレスキュー句を追加することをお勧めします。また、必要に応じて他の例外を救済することも可能です。リンクから他の例外を確認することもできます。 –

関連する問題