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つのrescue節で複数の例外クラスをまとめて捕捉することもできます:

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! となります。

チートシート

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
quiz icon腕試し

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

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