例外からレスキューする場合、発生した例外を参照する方法は 2 つあります。
begin
...
rescue Exception => e
handle_the_error(e)
end
と
begin
...
rescue Exception
handle_the_error($!)
end
それらは交換可能だと思いますが、そうですか?どちらか一方を使用する必要がある状況はありますか?
また、これらのスニペットは交換可能だと思います。ただし、スレッドグローバル マジックよりも明示的な変数を優先する必要があります。
$!
マジック var が便利な1 つのケース:
result_or_error = perform_some_operation() rescue $!
この行が意味することを知らない人のために:
いわゆる「インラインレスキュー」です。形式は次のとおりです。
<expr1> rescue <expr2>
まず、expr1
評価されます。例外が発生しなかった場合は、その値が返されます。ただし、例外があった場合は、expr2
が評価され、その値が返されます。
したがって、この場合、perform_some_operation()
例外が発生した場合、 variableresult_or_error
はその例外のインスタンスに設定されます ($!
最後のエラーが返されるため)。