Menu
Coddy logo textTech

複数の rescue 節

CoddyのRubyジャーニー「ロジックとフロー」セクションの一部。レッスン 45/56。

1つの begin ブロックには、複数の rescue 節を含めることができます。Rubyはこれらを上から下へとチェックし、例外クラスが一致する最初のものを実行します。

begin
  number = Integer(gets.chomp)
  result = 100 / number
  puts result
rescue ArgumentError
  puts "That's not a valid number."
rescue ZeroDivisionError
  puts "Can't divide by zero."
end

順番が重要です:一般的なクラスの前に具体的なクラスを記述します。最初に StandardError を配置するとすべてがキャッチされてしまい、それ以降の分岐は決して実行されなくなります。

カンマで列挙することで、1つの節で複数の例外クラスをキャッチすることもできます:

begin
  risky_call
rescue ArgumentError, TypeError => e
  puts "Bad input: #{e.message}"
end

複数の失敗モードに対してリカバリコードが同じである場合に使用します。

challenge icon

チャレンジ

簡単

入力から2行を読み込みます。両方とも整数として処理します。両方に対して Integer(...) を使用し、最初の数を2番目の数で割ります。

3つのケースを別々の rescue ブランチで処理します:

  • ArgumentErrorBad number! と出力
  • ZeroDivisionErrorCannot divide by zero! と出力
  • TypeErrorWrong type! と出力

すべてが正常に動作した場合は、Result: <a / b>(整数除算)と出力します。

入力が 10 / 2 の場合、出力は Result: 5 になります。10 / 0 の場合は Cannot divide by zero!10 / abc の場合は Bad number! となります。

自分で試してみよう

raw_a = gets.chomp
raw_b = gets.chomp

# TODO: begin ... rescue ArgumentError ... rescue ZeroDivisionError ... rescue TypeError ... end
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

ロジックとフローのすべてのレッスン

自分で練習してみよう: Rubyオンラインコンパイラ