Weird rescue

Can somebody tell why this happens ?

x = StandardError.new(:hello)
y = StandardError.new(:hello)
puts x == y # => true
puts x === y # => true

begin
raise x
rescue x
puts “ok” # gets printed
end

begin
raise x
rescue y
puts “ok” # doesn’t get printed
end

On Wed, Dec 5, 2012 at 2:13 AM, Kai König [email protected]
wrote:

x = StandardError.new(:hello)

y = StandardError.new(:hello)

x and y are different objects. try compare with #equal?

you may need

y=x

to force…

best regards -botp

Am 04.12.2012 19:13, schrieb Kai K

On Tue, Dec 4, 2012 at 5:01 PM, Eric C.
[email protected] wrote:

raise x

That is strange. According to the Pickaxe[1] (the online one at least;
I don’t have my 1.9 copy handy) the exception matching is supposed to
be done with kind_of?; and the source code[2] seems to bear that out.
Clearly StandardError.new(:hello).kind_of?(StandardError.new(:hello))
is not true; it raises a TypeError because the argument isn’t a class
or module.

[1] Programming Ruby: The Pragmatic Programmer's Guide
[2] http://rxr.whitequark.org/mri/source/eval.c#714

OK, so apparently this has been answered on StackOverflow:

On Tue, Dec 4, 2012 at 12:13 PM, Kai König [email protected]
wrote:

rescue x
puts “ok” # gets printed
end

begin
raise x
rescue y
puts “ok” # doesn’t get printed
end

That is strange. According to the Pickaxe[1] (the online one at least;
I don’t have my 1.9 copy handy) the exception matching is supposed to
be done with kind_of?; and the source code[2] seems to bear that out.
Clearly StandardError.new(:hello).kind_of?(StandardError.new(:hello))
is not true; it raises a TypeError because the argument isn’t a class
or module.

[1]
http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_exceptions.html
[2] http://rxr.whitequark.org/mri/source/eval.c#714