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



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

最新更新