我正在为代理样式的对象重新定义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
我认为你不能通过调用异常类作为这样的方法来引发异常。它找不到名为 ArgumentError
的方法,因此它会尝试调用您的method_missing
以查看您是否可以处理它,然后您尝试再次调用它,并且循环重复(在没有加载代码的新irb
会话中尝试它,您将看到它引发NoMethodError
(。
我相信最流行的抛出异常的方式是 2 个参数来raise
:
raise ArgumentError, "Here: #{symbol}"
虽然如果你想更明确一点,你也可以传入异常类的实例:
raise ArgumentError.new("Here: #{symbol}")