【问题标题】:Throw custom exception in `method_missing` without calling .new在 `method_missing` 中抛出自定义异常而不调用 .new
【发布时间】:2018-03-14 00:41:25
【问题描述】:

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

【问题讨论】:

    标签: ruby method-missing


    【解决方案1】:

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

    我相信最流行的抛出异常的方式是raise 的两个参数:

    raise ArgumentError, "Here: #{symbol}"
    

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

    raise ArgumentError.new("Here: #{symbol}")
    

    【讨论】:

    • 哈哈哎呀。感谢您的帮助。
    • 在 dong Python 工作后做了同样的事情...谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-06
    • 2012-01-24
    • 1970-01-01
    • 2012-10-28
    • 2011-05-30
    • 1970-01-01
    相关资源
    最近更新 更多