複数の 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つのrescue節で複数の例外クラスをまとめて捕捉することもできます:
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! となります。
チートシート
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つの分岐で複数の例外クラスをキャッチできます:
rescue ArgumentError, TypeError => e
puts "Bad input: #{e.message}"自分で試してみよう
raw_a = gets.chomp
raw_b = gets.chomp
# TODO: begin ... rescue ArgumentError ... rescue ZeroDivisionError ... rescue TypeError ... end
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。