I’ve been doing something very wrong my whole life. I think it’s time to confess and seek help.
You see, like so many developers I see the NotImplementedError class in various languages and think, to my self “I haven’t had a chance to fully implement this class, so in my methods that my colleagues call that I didn’t finish yet, I will raise that exception to let them know.”
I am ashamed of myself. And it’s time to get help.
You see the actual purpose of the NotImplementedError (as defined by the Ruby docs) is:
Raised when a feature is not implemented on the current platform. For example, methods depending on the fsync or fork system calls may raise this exception if the underlying operating system or Ruby runtime does not support them.
ERMERGERD! I am a terrible person. Abusing this error class just because my sub classes cannot meet the contractual obligation of the super class.
And I know I am not alone.
So whats the best practice, then?
Well, in Ruby’s case it turns out the answer is super simple; don’t raise an error at all! Instead, document the expectation and if a subclass fails to meet it a NameError, or often its subclass NoMethodError, will be raised automatically.