在`method_missing`中抛出自定义异常而不调用.new

时间:2018-03-14 00:41:26

标签: ruby method-missing

我正在为代理样式对象重新定义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

1 个答案:

答案 0 :(得分:4)

我认为你不能通过将异常类作为这样的方法来引发异常。它无法找到名为ArgumentError的方法,因此它会尝试调用您的method_missing来查看您是否可以处理它,然后再次尝试调用它,然后循环重复(在新的{{ 1}}会话没有加载代码,你会看到它引发irb)。

我认为最常见的抛出异常的方法是NoMethodError的2个参数:

raise

虽然如果你想更明确一些,你也可以传入一个异常类的实例:

raise ArgumentError, "Here: #{symbol}"