gpt4 book ai didi

ruby - 这个救援示例有什么问题?

转载 作者:数据小太阳 更新时间:2023-10-29 07:17:52 27 4
gpt4 key购买 nike

x = StandardError.new(:hello)
y = StandardError.new(:hello)
x == y # => true
x === y # => true

begin
raise x
rescue x
puts "ok" # gets printed
end

begin
raise x
rescue y
puts "ok" # doesn't get printed
end

为什么不打印第二个“ok”?我想不通。我读过 here ruby 使用 === 运算符将异常与 rescue 子句匹配,但表面上并非如此。

我正在使用 Ruby 1.9.3

编辑:所以看起来在执行 raise x 之后,x == yx === y 不再成立。似乎是因为 xy no longer have the same backtrace .

最佳答案

我认为这是一个错误,或者更确切地说是 Ruby 1.9 的规范不足。请注意,Ruby 2.0 提出了一个

TypeError: class or module required for rescue clause

第 8 行和第 14 行。

请注意,raise 也不一定按照您的想法进行。当你引发一个对象时,你实际上并没有引发那个对象,你引发了一个对象,它是根据你传递的对象构造的这些简单的规则:

  • 如果对象响应exception,调用对象的exception并引发返回值
  • 如果对象是Exception的子类,调用new并引发返回值
  • 否则失败
  • 如果上述任何方法的返回值不是 Exception 的实例,也会失败

因此,您实际上不是引发x,而是引发x.exception。不过,根据 Exception#exception 的文档,x.exceptionx

关于ruby - 这个救援示例有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13709100/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com