从异常中抢救时,有两种方法可以引用引发的异常:
begin
...
rescue Exception => e
handle_the_error(e)
end
Run Code Online (Sandbox Code Playgroud)
和
begin
...
rescue Exception
handle_the_error($!)
end
Run Code Online (Sandbox Code Playgroud)
我相信它们是可以互换的,但是它们呢?是否有任何情况应该使用另一个?
我也认为这些片段是可以互换的.但是你应该总是喜欢显式变量来进行线程全局魔术.
$!magic var很方便的一个案例:
result_or_error = perform_some_operation() rescue $!
Run Code Online (Sandbox Code Playgroud)
对于那些不知道这条线意味着:
这就是所谓的"内联救援".格式是这样的:
<expr1> rescue <expr2>
Run Code Online (Sandbox Code Playgroud)
首先,expr1进行评估.如果未引发异常,则返回其值.但是如果有异常,则expr2进行评估并返回其值.
因此,在这种情况下,如果perform_some_operation()引发异常,变量result_or_error将被设置为该异常的实例(因为$!返回上一个错误).