ベストアンサー1
TL;DR :StandardError
一般的な例外キャッチには代わりに使用します。元の例外が再度発生した場合 (例外のみをログに記録するためにレスキューする場合など)、レスキューはException
おそらく問題ありません。
Exception
の根源はRubyの例外階層なので、 を使用すると、 、、 などのサブクラスを含むすべてrescue Exception
の から rescue できます。SyntaxError
LoadError
Interrupt
レスキューによりInterrupt
、ユーザーはCTRLCプログラムを終了できなくなります。
RescueSignalException
により、プログラムがシグナルに正しく応答できなくなります。 以外では強制終了できませんkill -9
。
救助とは、失敗した が静かに救助されるSyntaxError
ことを意味します。eval
これらはすべて、このプログラムを実行し、または実行することによって表示できCTRLCますkill
。
loop do
begin
sleep 1
eval "djsakru3924r9eiuorwju3498 += 5u84fior8u8t4ruyf8ihiure"
rescue Exception
puts "I refuse to fail or be stopped!"
end
end
救助はException
デフォルトではありません。
begin
# iceberg!
rescue
# lifeboats
end
は から救出するのではなくException
、 から救出しますStandardError
。通常はデフォルトの よりも具体的な値を指定する必要がありますStandardError
が、 から救出すると範囲が狭まるのではなくException
広がるため、壊滅的な結果をもたらし、バグの検出が非常に困難になる可能性があります。
救助が必要な状況がありStandardError
、例外を含む変数が必要な場合は、次の形式を使用できます。
begin
# iceberg!
rescue => e
# lifeboats
end
これは次と同等です:
begin
# iceberg!
rescue StandardError => e
# lifeboats
end
レスキューを実行するのが理にかなっている数少ない一般的なケースの 1 つは、Exception
ログ記録やレポート作成の目的です。この場合は、例外をすぐに再度発生させる必要があります。
begin
# iceberg?
rescue Exception => e
# do some logging
raise # not enough lifeboats ;)
end