Ruby で例外をレスキューするのがなぜ悪いのか

Oluwafisayo Oluwatayo 2024年2月15日
  1. Ruby で例外をレスキューする際の問題
  2. Ruby での例外への最善のアプローチ
  3. 例外をレスキューできる状況
  4. まとめ
Ruby で例外をレスキューするのがなぜ悪いのか

Ruby の例外は、プログラムを実行しようとしたときにプログラムが遭遇するエラーです。 これらの例外のいくつかはプログラムをクラッシュさせる原因となるため、問題の内容とその原因を教えてくれるので非常に便利です。そうすれば、どのような解決策を適用できるかがわかります。

Ruby で例外をレスキューする際の問題

例外は、プログラムで発生している問題へのポインターとして機能するため、優れています。 コード内の例外をレスキューして、プログラムのクラッシュを引き起こす特定の例外をキャッチしたくなるかもしれませんが、これは解決策ではなく問題になる可能性があります。

プログラムが Ruby で実行されている場合、Ruby 自体がこれらのプログラム内に例外を持っているため、これらの例外によってプログラムがクラッシュすることはありません。 そのため、Ruby で例外をレスキューすると、コードで次の問題が発生します。

  1. 例外をレスキューすると Interrupt がレスキューされ、ユーザーが Ctrl+C で問題を終了できなくなります。
  2. SignalException もレスキューされ、プログラムがシグナルに応答しなくなります。 コード エディターを強制的に閉じる必要があります。
  3. SyntaxError がレスキューされると、Ruby システムによって行われる評価はバックグラウンドでのみ発生します。
  4. 例外をレスキューすると、Ruby がメモリを割り当てられないときに発生するエラーである noMemoryError が発生します。 レスキューする必要のない不要なエラーです。
  5. すべての例外が発生するため、バグハンティングが難しくなり、プログラムがクラッシュする原因となった実際の例外を特定することが難しくなります。

この動作を確認するために、このコードを実行して新しいファイルを作成し、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 で例外に対処する最善の方法は何でしょうか?

  1. 例外をレスキューする代わりに、Ruby の ensure 関数を利用できます。 これにより、例外が発生した場合でもコードが確実に実行されます。
  2. ここで発生する例外はアプリケーションに直接影響するエラーであるため、代わりに StandardError をレスキューします。

以下のコードのスニペットを見てみましょう。

new.rb:

loop do
  begin
    sleep 1
    eval "djsakru3924r9eiuorwju3498 += 5u84fior8u8t4ruyf8ihiure"
  rescue => e
    puts "I can't stop!"
  end
end

このコードを実行すると、すぐに構文エラーが発生します。

標準エラーのレスキュー

例外をレスキューできる状況

例外のレスキューが役立つ場合があります。 例外をログに記録したい状況では、例外を再発生させることができます。 これにより、その後の再訪問の例外がログに記録されます。

ユーザーが例外の処理方法を知っていれば、安全に例外を救出できます。

まとめ

例外は間違いなく、プログラムのエラーやバグへのポインターです。 プログラムが更新されているときに何を修正するかを知るのに役立ちます。 それは、ユーザーがそれらをどのように処理するかの問題です。

Oluwafisayo Oluwatayo avatar Oluwafisayo Oluwatayo avatar

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