Ruby で例外をレスキューするのがなぜ悪いのか
Ruby の例外は、プログラムを実行しようとしたときにプログラムが遭遇するエラーです。 これらの例外のいくつかはプログラムをクラッシュさせる原因となるため、問題の内容とその原因を教えてくれるので非常に便利です。そうすれば、どのような解決策を適用できるかがわかります。
Ruby で例外をレスキューする際の問題
例外は、プログラムで発生している問題へのポインターとして機能するため、優れています。 コード内の例外をレスキューして、プログラムのクラッシュを引き起こす特定の例外をキャッチしたくなるかもしれませんが、これは解決策ではなく問題になる可能性があります。
プログラムが Ruby で実行されている場合、Ruby 自体がこれらのプログラム内に例外を持っているため、これらの例外によってプログラムがクラッシュすることはありません。 そのため、Ruby で例外をレスキューすると、コードで次の問題が発生します。
- 例外をレスキューすると
Interrupt
がレスキューされ、ユーザーが Ctrl+C で問題を終了できなくなります。 SignalException
もレスキューされ、プログラムがシグナルに応答しなくなります。 コード エディターを強制的に閉じる必要があります。SyntaxError
がレスキューされると、Ruby システムによって行われる評価はバックグラウンドでのみ発生します。- 例外をレスキューすると、Ruby がメモリを割り当てられないときに発生するエラーである
noMemoryError
が発生します。 レスキューする必要のない不要なエラーです。 - すべての例外が発生するため、バグハンティングが難しくなり、プログラムがクラッシュする原因となった実際の例外を特定することが難しくなります。
この動作を確認するために、このコードを実行して新しいファイルを作成し、new.rb
という名前を付けます。
new.rb
:
loop do
begin
sleep 1
eval "djsakru3924r9eiuorwju3498 += 5u84fior8u8t4ruyf8ihiure"
rescue Exception
puts "I can't stop!"
end
end
I can't stop
の無限ループが表示され、Ctrl+C を使用してプログラムを停止しようとすると、そのまま続行されます。 唯一のオプションは、コード エディターを完全にシャットダウンすることです。
Ruby での例外への最善のアプローチ
例外をレスキューすると、プログラムで壊滅的なイベントが発生する可能性があることがわかりましたが、Ruby で例外に対処する最善の方法は何でしょうか?
- 例外をレスキューする代わりに、Ruby の
ensure
関数を利用できます。 これにより、例外が発生した場合でもコードが確実に実行されます。 - ここで発生する例外はアプリケーションに直接影響するエラーであるため、代わりに
StandardError
をレスキューします。
以下のコードのスニペットを見てみましょう。
new.rb
:
loop do
begin
sleep 1
eval "djsakru3924r9eiuorwju3498 += 5u84fior8u8t4ruyf8ihiure"
rescue => e
puts "I can't stop!"
end
end
このコードを実行すると、すぐに構文エラーが発生します。
例外をレスキューできる状況
例外のレスキューが役立つ場合があります。 例外をログに記録したい状況では、例外を再発生させることができます。 これにより、その後の再訪問の例外がログに記録されます。
ユーザーが例外の処理方法を知っていれば、安全に例外を救出できます。
まとめ
例外は間違いなく、プログラムのエラーやバグへのポインターです。 プログラムが更新されているときに何を修正するかを知るのに役立ちます。 それは、ユーザーがそれらをどのように処理するかの問題です。
Fisayo is a tech expert and enthusiast who loves to solve problems, seek new challenges and aim to spread the knowledge of what she has learned across the globe.
LinkedIn