【Ruby】レッスン3-06:例外処理を理解しよう

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

この記事で学べる知識:例外処理

この記事の練習問題を解くために必要な知識:
基礎文法と制御構造(レッスン1~2)メソッドの定義と呼出しデフォルト引数とキーワード引数メソッドの戻り値真偽値を返すメソッドエラーメッセージ例外処理

<<前のページ Ruby記事一覧 次のページ>>

Rubyの「例外処理」とは

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

プログラムは実行中に予期しないエラーが発生することがあります。

たとえばファイルが存在しない場合にファイルを読み込もうとしたり、ゼロで割ろうとしたときなどです。

このようなエラーに対して、事前に対処する方法を「例外処理」と呼びます。

Rubyでは例外処理を使うことで、エラーが発生してもプログラムが強制終了せず、適切な対応をとることができます。

例外処理の基本構文

Rubyで例外処理を行うにはbeginrescue構文を使います。

以下が基本的な例外処理の構文です。

begin
  # エラーが発生する可能性のある処理
rescue
  # エラーが発生した場合に実行する処理
end

この構文ではbeginブロック内にエラーが発生しうる処理を記述し、その下にrescueブロックを置きます。

rescueブロック内のコードは、エラーが発生した際に実行されます。

これによりプログラムが異常終了せず、指定した方法でエラーに対処することが可能です。

具体的な例

次に具体的な例を見てみましょう。

以下はゼロで割り算を試みる場合の例です。

begin
  puts "割り算を行います。"
  result = 10 / 0  # ゼロで割ることでエラーが発生します
  puts "結果: #{result}"
rescue
  puts "エラーが発生しました:ゼロで割ることはできません。"
end

このコードでは10 / 0によってゼロ除算のエラーが発生しますが、rescueブロックが実行され、「エラーが発生しました:ゼロで割ることはできません。」というメッセージが表示されます。

通常であればゼロ除算のエラーでプログラムが停止しますが、例外処理を使うことでエラーに対して適切なメッセージを出し、プログラムを続行させることができます。

例外処理の注意点とまとめ

【初心者向け】Rubyのメソッドと例外処理と使い方を分かりやすくまとめた概念図と使用例。 特にメソッドの呼び出しや戻り値、デフォルト引数とキーワード引数、例外処理の仕組みについて視覚的に理解できるようまとめている。

例外処理は必ずしもすべてのエラーに対して使うべきではありません。

たとえばエラーが発生した場合の挙動をプログラムの設計上重要なポイントとして扱うべき場合や、あえてエラーを発生させることで早期に問題を発見したい場合などもあります。

例外処理を使う場面を見極め、必要な箇所でのみ使うことが重要です。

Rubyの例外処理は非常にシンプルでわかりやすいため、エラー処理が必要な箇所にうまく取り入れて、プログラムの信頼性と安定性を向上させましょう。

例外処理の練習問題:

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

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

この問題の要件

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

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

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

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

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

この問題を解くヒント

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

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

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

1:puts "最初の数値を入力してください:"によりメッセージを出力
2:ユーザーの入力を取得し、整数型に変換して変数num1に代入
3:puts "二番目の数値を入力してください:"によりメッセージを出力
4:ユーザーの入力を取得し、整数型に変換して変数num2に代入
5:beginにより例外処理の開始を宣言
  □ 変数resultnum1num2で割った結果を代入
  □ putsにより計算結果を出力
6:rescue ZeroDivisionErrorでゼロ除算エラーの発生を検出
  □ putsによりエラーメッセージ「ゼロで割ることはできません。」を出力
7:endにより例外処理の終了

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

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

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

=begin
【穴埋め問題1】
ここで例外処理の開始を宣言してください。例外が発生する可能性のある処理を囲むコードを書いてください。
=end

  # 割り算を行う
  result = num1 / num2
  puts "結果:#{num1} / #{num2} = #{result}"

=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を使って、特定のエラーが発生したときにどのように対処するかを定義できます。

<<前のページ Ruby記事一覧 次のページ>>

この記事への質問・コメント

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

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






    Rubyのテキスト&問題集トップへ戻る
    トップページへ戻る