Ignorable Exceptions and Other Hacks

In 2011 I spoke about Ruby exception-handling at a number of conferences. One of those conferences was Rocky Mountain Ruby in Boulder, Colorado.

This talk was unique for a couple of reasons. First, I stripped out all the design and philosophy elements. Instead, I made it a code-heavy tour of little-known and seldom-seen features of the Ruby exception system. This let me relax a bit more and have more fun with it.

The other unique aspect of this talk was that I included a crazy exception hack that I hadn’t even included in my book on the topic. Up till now I think conference attendees and viewers of the Confreaks video are the only people who have seen it.

Here’s the video:

And here, for the first time outside of my slides, is the code for ignorable exceptions.

require 'continuation' # Ruby 1.9

class Exception
  attr_accessor :continuation
  def ignore
    continuation.call
  end
end

module RaiseWithIgnore
  def raise(*args)
    callcc do |continuation|
      begin
        super
      rescue Exception => e
        e.continuation = continuation
        super(e)
      end
    end
  end
end

class Object
  include RaiseWithIgnore
end

def whiny_method
  puts "Before raising"
  raise "Pay attention to me!"
  puts "After raising"
end

begin
  whiny_method
rescue => e
  puts "Ignoring '#{e}'"
  e.ignore
end
# >> Before raising
# >> Ignoring 'Pay attention to me!'
# >> After raising

I do not endorse this code for production use, but I think if nothing else it’s an interesting look at the sort of lunacy and/or awesomeness that is possible with continuations.