我正在为代理样式对象重新定义method_missing
。我希望能够抛出一个自定义NoMethodError
(或者如果NoMethodError
是一个特殊问题,我会使用下面的ArgumentError
)来给调用者提供有关原因的更多信息。特定的代理对象没有方法。
然而,当我尝试从method_missing
抛出任何异常时,我进入一个递归循环,最终导致SystemStackError: stack level too deep
。
我希望能够做到这样的事情:
class X
define method_missing(symbol, *args)
raise ArgumentError("Here: #{symbol} ")
end
end
x = X.new
x.a # Raise an ArgumentError, not a SystemStackError
答案 0 :(得分:4)
我认为你不能通过将异常类作为这样的方法来引发异常。它无法找到名为ArgumentError
的方法,因此它会尝试调用您的method_missing
来查看您是否可以处理它,然后再次尝试调用它,然后循环重复(在新的{{ 1}}会话没有加载代码,你会看到它引发irb
)。
我认为最常见的抛出异常的方法是NoMethodError
的2个参数:
raise
虽然如果你想更明确一些,你也可以传入一个异常类的实例:
raise ArgumentError, "Here: #{symbol}"