Was ist der beste Weg, um behandeln Sie Ausnahmen von Net::HTTP?
Was ist der beste Weg, um zu retten, Ausnahmen von Net::HTTP?
Ausnahmen sind beschrieben in Ruby ' s socket.c
wie Errno::ETIMEDOUT
, Errno::ECONNRESET
, und Errno::ECONNREFUSED
. Die Basisklasse für alle diese ist SystemCallError
, aber es fühlt sich komisch an, schreiben Sie code wie den folgenden, weil SystemCallError
scheint so weit entfernt, eine HTTP
nennen:
begin
response = Net::HTTP.get_response(uri)
response.code == "200"
rescue SystemCallError
false
end
Ist es nur mir so? Gibt es eine bessere Art das zu handhaben, über die Festsetzung Net::HTTP
zu handhaben, die Errno
Ausnahmen, die wahrscheinlich pop-up, und Kapseln Sie in einer übergeordneten HttpRequestException
?
Vielen Dank an alle! Ich landete Verpackung, die Antworten in der form von ein Ruby-Gem, die ich in der Zukunft nutzen können, um mit dieser situation umzugehen: net_http_exception_fix [github.com/edward/net_http_exception_fix]
Korrekte link: github.com/edward/net_http_exception_fix (Edward ' s Kommentar schlürft eine zusätzliche "]" in der URL).
Ich habe geschrieben, andere Bibliothek, löst das gleiche problem in einer anderen Weise: github.com/barsoom/net_http_timeout_errors
Cool! Schöne Arbeit, Henrik.
Korrekte link: github.com/edward/net_http_exception_fix (Edward ' s Kommentar schlürft eine zusätzliche "]" in der URL).
Ich habe geschrieben, andere Bibliothek, löst das gleiche problem in einer anderen Weise: github.com/barsoom/net_http_timeout_errors
Cool! Schöne Arbeit, Henrik.
InformationsquelleAutor Edward Ocampo-Gooding | 2011-03-20
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich Zustimmen, es ist eine absolute Schmerz zu behandeln alle möglichen Ausnahmen. Blick auf diese um ein Beispiel zu sehen:
Was ich getan habe, und gesehen die meisten Menschen tun, Weg von Net::HTTP-und zu bewegen, um 3rd-party-HTTP-Bibliotheken, wie zum Beispiel:
httparty und faraday
HTTPClient
ist heiss!!! Ich denke, ich werde am Ende mit, dass in die Zukunft. Vielen Dank für die Referenz.Dein Google-fu ist besser und ich bin froh, gelandet zu haben, auf Tammer Arbeit. Das ist genau das, was ich suchte.
Froh, es zu hören!
Errno::ECONNREFUSED
lohnt sich also auch. Siehe hier Liste der Fehler für Unix-basierte SystemeInformationsquelleAutor Mike Lewis
Erlebte ich das gleiche problem, und nach viel Forschung, erkannte ich, dass der beste Weg, um zu behandeln alle Ausnahmen Net::HTTP-Methoden werfen würde, ist die Rettung aus der Standardfehler.
Als zeigte durch Mike Lewis ' Antwort, Tammer Saleh blog-post schlägt vor, die Rettung aus einer Menge Ausnahmen, aber es ist immer noch Fehler. Es gibt einige Ausnahmen, die er nicht retten aus, wie
Errno::EHOSTUNREACH
,Errno::ECONNREFUSED
- und möglich einigesocket
Ausnahmen.So, wie ich im tenderlove die übersetzung eines alten ruby-dev thread, die beste Lösung ist die Rettung von
StandardError
leider:Es ist schrecklich, aber wenn Sie wollen, dass Ihr system nicht zu brechen, weil diese anderen Ausnahmen, die diesen Ansatz verwenden.
InformationsquelleAutor Hugo Tavares
Ihre intuition auf dieses Recht, für die stabilste Lösung, würde ich wahrscheinlich retten Sie diese einzeln (oder in kleinen Gruppen) und nehmen Sie die entsprechenden Aktion, wie Sie versuchen, die Verbindung wieder herzustellen, oder der Verzicht auf die Anforderung, alle zusammen. Ich möchte vermeiden, mit einer sehr hohen-Niveau/generic retten, weil es vielleicht fangen Sie die Ausnahmen, die ich nicht bereit bin oder nicht erwarten.
InformationsquelleAutor ctcherry
Anderen Ansatz zu aggregieren all diese Ausnahmen in einem ständigen, und dann wieder verwenden diese Konstante, z.B.:
Es ist weit mehr wartbar und sauberer.
Jedoch, Wort der Warnung. Ich habe kopiert die möglichen Ausnahmen Liste, die von der genannten Tammer Saleh blog-post, und ich weiß, dass seine Liste unvollständig ist. Zum Beispiel
Net::HTTP.get(URI("wow"))
wirftErrno::ECONNREFUSED
welches nicht aufgeführt ist. Auch ich wäre nicht überrascht, wenn die Liste geändert werden sollte, für verschiedene Ruby-Versionen.Aus diesem Grund empfehle ich, kleben
rescue StandardError
in den meisten Fällen. Um zu vermeiden, fangen zu viel, bewegen sich so viel wie möglich außerhalb des begin-rescue-end-block, vorzugsweise lassen Sie nur einen Anruf zu einem derNet::HTTP
Methoden.InformationsquelleAutor skalee