【发布时间】:2012-12-04 18:02:47
【问题描述】:
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 使用 === 运算符来匹配救援子句的异常,但表面上并非如此。
我使用的是 Ruby 1.9.3
编辑:所以在执行raise x、x == y 和x === y 之后似乎不再成立。似乎是因为x 和y no longer have the same backtrace。
【问题讨论】:
-
不,这意味着“捕获任何 StandardError 和子类,并将实例放入变量 y”。
y不被解释为一个值(如我所愿),而是一个变量名。 -
我认为如果您尝试在 RFID 标签上进行模式匹配,
raise / catch成语可能不是最清晰的方法。case语句或使用模式的动态调度呢? -
应用程序有一些与卡通信的“低级”逻辑。这是抛出异常的地方。在此之上是一些更高层次的应用逻辑。标签返回的一些错误实际上是相当高的级别(诸如“文件已存在于标签上”之类的东西)并且必须冒泡给用户。例外似乎是最好的选择。
-
为什么不使用
RFIDException类并在引发异常raise RFIDException, "additional info"时附加您需要的任何其他错误信息。然后救援这个异常并应用救援块中需要的任何处理。如果您需要向上冒泡错误,只需重新引发相同的异常。您不营救Exception班级是在“滥用”营救机制。我不认为它是为你想做的事情而指定的。 -
如果所有异常都需要在同一个地方处理,这将起作用。我会
rescue RFIDException然后做case exception.type或类似的事情并处理它。不幸的是,不同的错误必须在调用堆栈的不同级别处理。