9

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

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

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

我相信它们是可以互换的,但它们是吗?在任何情况下应该使用一个而不是另一个?

4

1 回答 1

9

我也认为这些片段是可以互换的。但是你应该总是更喜欢显式变量而不是线程全局魔法。

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

result_or_error = perform_some_operation() rescue $!

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

这就是所谓的“在线救援”。格式是这样的:

<expr1> rescue <expr2>

首先,expr1被评估。如果没有引发异常,则返回其值。但是如果有异常, thenexpr2被评估并返回它的值。

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

于 2013-05-19T17:56:05.383 回答