$之间的区别!与救援变量

时间:2013-05-19 17:52:25

标签: ruby exception

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

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

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

我相信它们是可以互换的,但是它们呢?是否有任何情况应该使用另一个?

1 个答案:

答案 0 :(得分:9)

我也认为这些片段是可以互换的。但是你应该总是选择显式变量来进行线程全局魔术。

$! magic var很方便的一种情况:

result_or_error = perform_some_operation() rescue $!

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

的人

这就是所谓的“内联救援”。格式是这样的:

<expr1> rescue <expr2>

首先,评估expr1。如果未引发异常,则返回其值。但如果有异常,则会计算expr2并返回其值。

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