Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to catch Errno::ECONNRESET class in "case when"?

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 
like image 914
Nakilon Avatar asked Sep 27 '10 06:09

Nakilon


1 Answers

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

like image 66
Chubas Avatar answered Sep 20 '22 10:09

Chubas