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