My application (Ruby 1.9.2) may raise different exceptions, including net-connection breaks. I rescue Exception => e
, then do case/when
to handle them in defferent ways, but several errors go through my cases straight to else
.
rescue Exception => e p e.class case e.class when Errno::ECONNRESET p 1 when Errno::ECONNRESET,Errno::ECONNABORTED,Errno::ETIMEDOUT p 2 else p 3 end end
Prints:
Errno::ECONNRESET 3
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With