I am wondering about design alternatives regarding exception naming in
Ruby. Is there a naming convention for exceptions that are declared
inside a module?
For example, let’s say we have a module named MP3, and we want to have a
base exception for MP3-related errors. There are two basic choices I am
considering here:
module MP3
class MP3Error < StandardError; end # Alternative 1
class Error < StandardError; end # Alternative 2
end
Outside the module, Error would be disambiguated by MP3 (MP3::Error).
However, I am uneasy about this, because of the following situation.
Imagine someone has some existing code that mixes in module Other:
module Other
class Error < StandardError; end
end
class Foo
include Other
def Foo.oops
raise Error, “Who am I?”
rescue Error => e
puts “#{e} #{e.class.name}”
end
end
Foo.oops # Who am I? Other::Error
Now this hapless person mixes in MP3.
class Foo
include Other
include MP3
def Foo.oops
raise Error, “Who am I?”
rescue Error => e
puts “#{e} #{e.class.name}”
end
end
Foo.oops # Who am I? MP3::Error
- Is this a real concern?
- Do you think it would be better to have exception names that are less
likely to clash at the cost of some duplication (e.g. MP3::MP3Error
instead of MP3::Error)?