複数の 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複数の失敗モードに対してリカバリコードが同じである場合に使用します。
チャレンジ
簡単入力から2行を読み込みます。両方とも整数として処理します。両方に対して Integer(...) を使用し、最初の数を2番目の数で割ります。
3つのケースを別々の rescue ブランチで処理します:
ArgumentError→Bad number!と出力ZeroDivisionError→Cannot divide by zero!と出力TypeError→Wrong 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
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
ロジックとフローのすべてのレッスン
自分で練習してみよう: Rubyオンラインコンパイラ