Menu
Coddy logo textTech

begin / rescue

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

プログラムが例外によってクラッシュするのを防ぐには、リスクのあるコードを begin ... rescue ... end で囲みます。begin の内部で例外が発生した場合、Ruby は処理を中断する代わりに、対応する rescue ブロックにジャンプします。

begin
  result = 10 / 0
  puts result
rescue ZeroDivisionError
  puts "Cannot divide by zero!"
end
# ゼロで割ることはできません!

=> e を使用して例外オブジェクト自体を取得し、その .message を読み取ることができます:

begin
  Integer("hello")
rescue ArgumentError => e
  puts "Bad input: #{e.message}"
end
# Bad input: invalid value for Integer(): "hello"

例外クラス名を指定しない場合、rescue 単体では StandardError とその派生クラス(日常的なエラーの大部分)を補足します。捕獲(キャッチ)は、rescue ブロック内で何らかの処理(デフォルト値の代入、問題のログ出力、ユーザーへの再入力要求など)を行える場合に最も効果的です。

challenge icon

チャレンジ

簡単

入力から2行を読み込みます。両方とも整数である必要がありますが、2行目は有効な数値ではない可能性があります。

2行目のパースを begin / rescue でラップします:

  • Integer(input) を使用します(不正な文字列の場合は ArgumentError を発生させます)
  • パースに成功した場合は、Sum: <a + b> を出力します
  • 失敗した場合は、Bad number! を出力します

入力が 3 で次に 4 の場合、出力は Sum: 7 になります。3 で次に abc の場合は、Bad number! になります。

自分で試してみよう

a = gets.to_i
raw_b = gets.chomp

# TODO: Integer(raw_b) の周りに begin/rescue を; 合計を出力するか、指示からの正確なテキストを
quiz icon腕試し

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

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

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