Where are catch and throw useful in Ruby?

ruby

Solution

Note: It looks like a few things have changed with catch/throw in 1.9. This answer applies to Ruby 1.9.

A big difference is that you can `throw` anything, not just things that are derived from `StandardError`, unlike `raise`. Something silly like this is legal, for example:

throw Customer.new

but it's not terribly meaningful. But you can't do:

irb(main):003:0> raise Customer.new
TypeError: exception class/object expected
    from (irb):3:in `raise'
    from (irb):3
    from /usr/local/bin/irb:12:in `<main>'

Problem

I really don't see a sane use for these. There is already `rescue` and `raise`, so why the need for `throw` and `catch`? It seems they are supposed to be used to jump out of deep nesting, but that just smells like a goto to me. Are there any examples of good, clean use for these?

Original source