複数の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(...)を使用し、その後、1行目を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オンラインコンパイラ