2016-11-24 3 views
7

私はRestClientを使用して、rubyクラスでネットワークコールを行います。私はインターネットに接続していないときはいつでもSocketErrorを取得しています。私は救助ブロックを加えて例外を捕まえましたが、私はそうすることができません。RestClientでRubyでSocket Errorを救う方法は?

エラーメッセージは次のとおりです。 SocketError (Failed to open TCP connection to api.something.com:443 (getaddrinfo: Name or service not known))

module MyProject 
    class Client 
    def get_object(url, params={}) 
     response = RestClient.get(url, {params: params}) 
    rescue SocketError => e 
     puts "In Socket errror" 
    rescue => e 
     puts (e.class.inspect) 
    end 
    end 
end 

幅広い救助が呼び出され、印刷SocketErrorが、なぜ以前rescue SocketErrorがトリガされていませんます!

私が紛失しているものがありますか?

+0

私は元、残りのクライアントは例外を処理し、私たちに渡していると思います例外はSocketErrorでした –

+1

これを見てくださいhttps://github.com/rest-client/rest-client/blob/master/lib/restclient/exceptions.rb#L103 –

+0

@WishZone彼らのドキュメントでは、 'SocketError'を含むいくつかのエラーを処理します。まだ実行中であれば、それらを捕まえる方法はありますか? 上記のバックトレースも追加しています。 – aks

答えて

1

正常に失敗したい場合に備えて、救助する必要があるいくつかの例外があります。

require 'rest-client' 
def get_object(url, params={}) 
    response = RestClient.get(url, {params: params}) 
rescue RestClient::ResourceNotFound => e 
    p e.class 
rescue SocketError => e 
    p e.class 
rescue Errno::ECONNREFUSED => e 
    p e.class 
end 

get_object('https://www.google.com/missing') 
get_object('https://dasdkajsdlaadsasd.com') 
get_object('dasdkajsdlaadsasd.com') 
get_object('invalid') 
get_object('127.0.0.1') 

404宛先であるURIに関する問題や、存在しないドメインやIPなどの問題がある可能性があるためです。

上記のように、リモートURIへの接続を処理する際に発生する可能性があるさまざまなシナリオがあります。上記のコードは、最も一般的なシナリオから救済されています。

最初のURLは、RestClient自体によって処理されるURLがありません。

以下の3つは無効なドメインです.SocketError(この場合は基本的にDNSエラー)で失敗します。我々はそれで実行しているサーバーがないIPに接続しようとする最後の呼び出しで最後に

- したがって、それはERRNOをスロー:: ECONNREFUSED

関連する問題