What’s the best way to rescue exceptions from Net::HTTP?
Exceptions thrown are described in Ruby’s
Errno::ECONNREFUSED. The base class to all of these is
SystemCallError, but it feels weird to write code like the following because
SystemCallError seems so far removed from making an
begin response = Net::HTTP.get_response(uri) response.code == "200" rescue SystemCallError false end
Is it just me? Is there a better way to handle this beyond fixing
Net::HTTP to handle the
Errno exceptions that would likely pop up and encapsulate them in a parent
I agree it is an absolute pain to handle all the potential exceptions. Look at this to see an example:
Net::HTTPcan be a pain. It's got about 40 different ways to do any one task, and about 50 exceptions it can throw.
Just for the love of google, here's what I've got for the "right way" of catching any exception that Net::HTTP can throw at you:
begin response = Net::HTTP.post_form(...) # or any Net::HTTP call rescue Timeout::Error, Errno::EINVAL, Errno::ECONNRESET, EOFError, Net::HTTPBadResponse, Net::HTTPHeaderSyntaxError, Net::ProtocolError => e ... end
Why not just
rescue Exception => e? That's a bad habit to get into, as it hides any problems in your actual code (like SyntaxErrors, whiny nils, etc). Of course, this would all be much easier if the possible errors had a common ancestor.
The issues I've been seeing in dealing with Net::HTTP have made me wonder if it wouldn't be worth it to write a new HTTP client library. One that was easier to mock out in tests, and didn't have all these ugly little facets.
What I've done, and seen most people do, is move away from Net::HTTP and move to 3rd party HTTP libraries such as: