Ruby練習問題1-8:例外処理プログラムを作ろう

記事内に商品プロモーションを含む場合があります

Rubyの初心者向け問題1-8:例外処理プログラムを作ろう

この問題を解くために必要な知識:
【レベル1の知識】
コメントの書き方、変数と定数、基本データ型、四則演算と演算子、入力と出力、文字列操作、分岐処理(if、if~else、elsif、case)、繰り返し処理(for、while、until、each)、範囲(Range)、例外処理(begin-rescue-end)

<<前の問題 問題集Top 次の問題>>

Rubyの文法「例外処理」とは

ここでは例外処理の意味や使い方を復習します。必要ない方はここをクリックして練習問題へ飛びましょう。



プログラムがエラーを起こした際、通常その場で終了してしまいますが、例外処理を使うことでプログラムの異常な終了を防ぐことができます。

Rubyでは、begin-rescue-end構文を使って例外をキャッチし、適切に対処することができます。

例外処理の主な目的は、エラーが発生した時にどのように対応するかを定義することです。

特にゼロ除算(0で割ること)が発生した場合など、特定のエラーを捕捉して処理を行います。

例外処理の基本構文

Rubyの例外処理は、以下のような構文で記述します。

begin
  # 例外が発生する可能性のあるコード
rescue エラーの種類
  # 例外発生時に実行される処理
end

例:ゼロ除算のエラー処理

begin
  1 / 0
rescue ZeroDivisionError
  puts "ゼロで割ることはできません"
end

この例では、1 / 0というゼロ除算が実行され、通常であればプログラムがエラーで終了します。

しかし、rescueZeroDivisionErrorをキャッチし、代わりに「ゼロで割ることはできません」というメッセージが表示されます。

複数の例外を処理する

複数の異なる例外を処理することもできます。

例えば、以下のように複数のrescueブロックを使って、異なるエラーに対応することができます。

begin
  # 例外が発生する可能性のあるコード
rescue ZeroDivisionError
  puts "ゼロで割ることはできません"
rescue StandardError
  puts "何らかのエラーが発生しました"
end

まとめ

例外処理を理解することで、予期せぬエラーが発生した際にもプログラムが適切に対応できるようになります。

Rubyのbegin-rescue-end構文を活用し、プログラムの信頼性を高めることが重要です。 ​



Ruby練習問題1-8:例外処理プログラムを作ろう

例外処理を使って、ゼロで割った場合にエラーメッセージを表示する割り算プログラムを作成してください。

ユーザーから2つの数値を入力させ、2つ目の数値がゼロでない場合は割り算を行い、ゼロの場合はエラーメッセージを表示します。

この問題の要件

以下の要件に従ってコードを完成させてください。

  • ユーザーに2つの数値を入力させ、それぞれ変数num1num2に格納すること。
  • begin-rescue-end構文を使用して、ゼロ除算エラーを処理すること。
  • ゼロで割った場合、rescueブロック内で「ゼロで割ることはできません」というエラーメッセージを表示すること。
  • 割り算が成功した場合、計算結果を「num1 / num2 = 結果」という形式で表示すること。

ただし、以下のような実行結果となること。

----- ↓出力される結果の例↓ -----

最初の数値を入力してください:
10
二番目の数値を入力してください:
2
結果:10 / 2 = 5
最初の数値を入力してください:
10
二番目の数値を入力してください:
0
エラー:ゼロで割ることはできません。

----- ↑出力される結果の例↑ -----

この問題を解くヒント

1からコードを組み立てることが難しい場合は、以下のヒントを開いて参考にしましょう。

ヒント1【コードの構成を見る】

正解のコードは上から順に以下のような構成となっています。

1.ユーザーからの入力受付
 1-1. putsを使って最初の数値を入力させる
 1-2. num1という変数に最初の数値を格納
 1-3. putsを使って二番目の数値を入力させる
 1-4. num2という変数に二番目の数値を格納

2.例外処理を使った割り算
 2-1. begin-rescue-end構文の開始
  2-1-1. num1num2で割り、その結果をresultに格納
  2-1-2. 割り算の結果を「num1 / num2 = 結果」という形式で表示
 2-2. rescueブロック内でゼロ除算エラーを捕捉
  2-2-1. エラーメッセージ「ゼロで割ることはできません」を表示

ヒント2【穴埋め問題にする】

以下のコードをコピーし、コメントに従ってコードを完成させて下さい。

# 割り算プログラム

# ユーザーに最初の数値を入力させる
puts "最初の数値を入力してください:"
num1 = gets.chomp.to_i
# ユーザーに二番目の数値を入力させる
puts "二番目の数値を入力してください:"
num2 = gets.chomp.to_i

begin
  =begin
  【穴埋め問題1】
  ここにnum1をnum2で割り、その結果を変数resultに代入し、結果を表示するコードを書いてください。
  =end
rescue ZeroDivisionError
  =begin
  【穴埋め問題2】
  ここにゼロで割った時のエラーメッセージを表示するコードを書いてください。
  =end
end

 

このヒントを見てもまだ回答を導き出すのが難しいと感じる場合は、先に正解のコードと解説を見て内容を理解するようにしましょう。



解答例と解説

この問題の一つの正解例とそのコードの解説を以下に示します。

正解コードの例

例えば以下のようなプログラムが考えられます。

********************

# 割り算プログラム

# ユーザーに最初の数値を入力させる
puts "最初の数値を入力してください:"
num1 = gets.chomp.to_i
# ユーザーに二番目の数値を入力させる
puts "二番目の数値を入力してください:"
num2 = gets.chomp.to_i

begin
  # 割り算を行う
  result = num1 / num2
  puts "結果:#{num1} / #{num2} = #{result}"
rescue ZeroDivisionError
  # ゼロで割った場合の例外処理
  puts "エラー:ゼロで割ることはできません。"
end

********************

コードの解説

このプログラムでは、ユーザーから2つの数値を入力してもらい、それらを使って割り算を行います。

もし2つ目の数値が0であった場合、通常のプログラムではエラーが発生して終了してしまいますが、このプログラムでは「例外処理」を使ってエラーが発生したときに適切に対処しています。

ユーザーからの入力部分

puts "最初の数値を入力してください:"
num1 = gets.chomp.to_i
puts "二番目の数値を入力してください:"
num2 = gets.chomp.to_i

まず、putsを使ってユーザーに数値を入力してもらいます。getsで入力を受け取り、chompメソッドで改行を取り除きます。

その後、to_iを使って文字列を整数に変換します。このようにして2つの数値をnum1num2という変数に格納します。

割り算と例外処理部分

begin
  result = num1 / num2
  puts "結果:#{num1} / #{num2} = #{result}"
rescue ZeroDivisionError
  puts "エラー:ゼロで割ることはできません。"
end

ここで重要なのが、Rubyの「例外処理」です。begin-rescue-endという構文を使って、割り算中にエラーが発生してもプログラムがクラッシュしないようにします。

  • beginブロック: この中には、エラーが発生する可能性のあるコードを書きます。この場合、num1 / num2という割り算が行われます。num2が0でない場合は割り算が正常に実行され、その結果がresultに代入されます。putsで結果を表示します。
  • rescueブロック: もしnum2が0の場合、ZeroDivisionErrorというエラーが発生します。このエラーはrescueブロックで捕捉され、「ゼロで割ることはできません」というエラーメッセージを表示します。このようにして、エラーを適切に処理することでプログラムが異常終了することを防ぎます。

まとめ

例外処理は、プログラムの動作中に予期せぬエラーが発生した場合でも、プログラム全体がクラッシュするのを防ぐために使われます。

Rubyではbegin-rescue-endを使って、特定のエラーが発生したときにどのように対処するかを定義できます。

<<前の問題 問題集Top 次の問題>>

この問題への質問・コメント

この問題を作成するにあたりAIを活用しています。

問題ないことは確認していますが、もし間違いや表現の違和感などありましたら、ご指摘頂けると大変助かります。






    Ruby練習問題集へ戻る
    トップページへ戻る