9

例外からレスキューする場合、発生した例外を参照する方法は 2 つあります。

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

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

それらは交換可能だと思いますが、そうですか?どちらか一方を使用する必要がある状況はありますか?

4

1 に答える 1

9

また、これらのスニペットは交換可能だと思います。ただし、スレッドグローバル マジックよりも明示的な変数を優先する必要があります。

$!マジック var が便利な1 つのケース:

result_or_error = perform_some_operation() rescue $!

この行が意味することを知らない人のために:

いわゆる「インラインレスキュー」です。形式は次のとおりです。

<expr1> rescue <expr2>

まず、expr1評価されます。例外が発生しなかった場合は、その値が返されます。ただし、例外があった場合は、expr2が評価され、その値が返されます。

したがって、この場合、perform_some_operation()例外が発生した場合、 variableresult_or_errorはその例外のインスタンスに設定されます ($!最後のエラーが返されるため)。

于 2013-05-19T17:56:05.383 に答える