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 ブロック内で何らかの処理(デフォルト値の代入、問題のログ出力、ユーザーへの再入力要求など)を行える場合に最も効果的です。
チャレンジ
簡単入力から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 を; 合計を出力するか、指示からの正確なテキストを
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
ロジックとフローのすべてのレッスン
自分で練習してみよう: Rubyオンラインコンパイラ