-
26
JUN
2008Summoning Error Classes As Needed
In the past, I've written a lot of code like this:
class SomeThing class SomeError < RuntimeError; end class AnotherError < RuntimeError; end class YetAnotherError < RuntimeError; end # some methods that can raise the above errors... end
I have a new strategy I've been using for code like this and it has really been working out well. Here is how I do the same thing today:
class SmarterThing def self.const_missing(error_name) # :nodoc: if error_name.to_s =~ /Error\z/ const_set(error_name, Class.new(RuntimeError)) else super end end # error raising methods here... end
Let's discuss how this works. The
const_missing()
method is a hook in Ruby, much like the belovedmethod_missing()
. Note thatconst_missing()
is a class method though, instead of an instance method. When a constant is used and Ruby can't find it, a call to the hook will be triggered.In this version, I just check to see if the constant name ends in
Error
. If it does, I summon anException
subclass on the fly. Other calls to this hook are forwarded on to Ruby's default error raising implementation viasuper
.