Bug #9083
closedBasicObject#method_missing does not always raise NoMethodError for missing methods
Description
def method_missing(name, *)
super
rescue NoMethodError => e
end
if the method is called without the receiver, it will raise just a NameError (variable or method missing)
the text of the error can differ depending on the presence of the receiver, but it seems counter-intuitive to not receive a NoMethodError when you are clearly attempting to call a non-existent method.
Updated by jeremyevans0 (Jeremy Evans) almost 5 years ago
- Status changed from Open to Closed
- Backport deleted (
1.9.3: UNKNOWN, 2.0.0: UNKNOWN)
NoMethodError
is a subclass of NameError
. I think what you are running into is:
BasicObject.new.foo # NoMethodError
BasicObject.new.instance_exec{foo} # NameError
In both of these cases, BasicObject#method_missing
is called, but that method has some magic to determine which error to raise. This behavior in both cases is expected, because the foo
in the second case would be a local variable reference if there was a local variable reference in scope. Ruby does not know whether your intention was to reference a local variable or call a method, and therefore uses the more generic NameError
instead of the more specific NoMethodError
in that case. In the first case, the foo
is definitely a method call and not a local variable reference, so Ruby can use a more specific error.