How to catch Errno::ECONNRESET class in case when?
This is because of how the ===
operator works on the class Class
The case
statement internally calls the ===
method on the object you are evaluating against. If you want to test for e
class, you just test against e
, not e.class
. That's because e.class
would fall into the when Class
case, because, well, e.class is a Class.
rescue Exception => e
case e
when Errno::ECONNRESET
p 1
when Errno::ECONNRESET,Errno::ECONNABORTED,Errno::ETIMEDOUT
p 2
else
p 3
end
end
Yeah, Ruby can have weird semantics sometimes
Ruby UDPSocket throws ERRNO:ECONNRESET
If there is an error on the socket recv
will not block, but remove and return the error. In this case the packet probably was sent, but no receiver was set up at localhost:7000, so it got back an ICMP unreachable. So set the the socket error to ECONNRESET
.
How to rescue all exceptions under a certain namespace?
All the Errno
exceptions subclass SystemCallError
:
Module
Errno
is created dynamically to map these operating system errors to Ruby classes, with each error number generating its own subclass ofSystemCallError
. As the subclass is created in moduleErrno
, its name will startErrno::
.
So you could trap SystemCallError
and then do a simple name check:
rescue SystemCallError => e
raise e if(e.class.name.start_with?('Errno::'))
# do your thing...
end
ERROR Errno::ECONNRESET: Connection reset by peer
My quick guess is this looks like you have a problem with your sessions and protect_from_forgery is kicking in.
I had a similar problem and smashed my head against the wall for a few days, it turned out to be I was assigning an entire object to a session object instead of just the id. A quick note, non-GET requests are the ones that trigger the protect_from_forgery.
What’s the best way to handle exceptions from Net::HTTP?
I agree it is an absolute pain to handle all the potential exceptions. Look at this to see an example:
Working with
Net::HTTP
can 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:
httparty and faraday
Ruby class types and case statements
You must use:
case item
when MyClass
...
I had the same problem:
How to catch Errno::ECONNRESET class in "case when"?
npm not working - read ECONNRESET
use
npm config set registry http://registry.npmjs.org/
so that npm requests for http
url instead of https
.
and then try the same npm install
command
How do I debug error ECONNRESET in Node.js?
A simple tcp server I had for serving the flash policy file was causing this. I can now catch the error using a handler:
# serving the flash policy file
net = require("net")
net.createServer((socket) =>
//just added
socket.on("error", (err) =>
console.log("Caught flash policy server socket error: ")
console.log(err.stack)
)
socket.write("<?xml version=\"1.0\"?>\n")
socket.write("<!DOCTYPE cross-domain-policy SYSTEM \"http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd\">\n")
socket.write("<cross-domain-policy>\n")
socket.write("<allow-access-from domain=\"*\" to-ports=\"*\"/>\n")
socket.write("</cross-domain-policy>\n")
socket.end()
).listen(843)
Related Topics
Skip Over Iteration in Enumerable#Collect
How to Write a Ruby Command Line App That Supports Tab Completion
How to Do Basic Authentication with Restclient
Case-Insensitive Array#Include
Gem Install Pg Can Not Bind to Libpq
Rails: Validation in Model VS Migration
Sprockets::Circulardependencyerror in Store#Index
Why Alias_Method Fails in Rails Model
Difference Between Kernel#Yield_Self, Yield(Self), Kernel#Then and Object#Tap in Ruby
How Does Defining [Square Bracket] Method in Ruby Work
Creating Routes with an Optional Path Prefix
Are the Date, Time, and Datetime Classes Necessary
Which Algorithm Does Ruby's Sort Method Use
Writing Over Previously Output Lines in the Command Prompt with Ruby
How to Remove Ruby from Ubuntu