抢救异常时,有两种方法可以引用引发的异常:

begin
  ...
rescue Exception => e
  handle_the_error(e)
end


begin
  ...
rescue Exception
  handle_the_error($!)
end

我相信它们是可以互换的,但是吗?在任何情况下都应使用另一种方法吗?

最佳答案

我也认为这些片段是可以互换的。但是,您应该始终比线程全局魔术更喜欢显式变量。
$! magic var很方便的一种情况:

result_or_error = perform_some_operation() rescue $!

对于那些不知道这行意味着的人:

所谓的“在线救援”。格式是这样的:
<expr1> rescue <expr2>

首先,对expr1进行评估。如果未引发异常,则返回其值。但是,如果存在异常,则会评估expr2并返回其值。

因此,在这种情况下,如果perform_some_operation()引发了异常,则将result_or_error变量设置为该异常的实例(因为$!返回上一个错误)。

关于ruby - 两者之间的差价!与带有救援的变量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16637662/

10-10 04:59