Rubyでは、例外処理をbegin~rescue~endの構文により、ブロックを利用して記述します。なお例外処理とは、プログラムがエラーとなって途中で停止させず、利用者にエラー発生を伝えるメッセージを表示する機能などに使われ重要な機能です。
WebシステムなどRubyで作成するアプリケーションでは必須の機能なので、ぜひ使い方をマスターしておきましょう。今回は、このRubyにおける、beginで始まる例外処理の書き方について詳しく解説します。
- 例外処理はプログラムを強制停止せずに、利用者にエラーを通知する仕組み
- Rubyの例外処理はbegin~rescue~endの構文で記述する
- Rubyの例外処理はbeginを省略した書き方も可能
Rubyにおける例外処理
Webシステムなど、人が操作するプログラムでは、想定外の操作によって誤動作するケースが必ずあります。そのような場合、プログラムを強制停止せず、正しい操作を案内したり、開発者への連絡を促さなければなりません。そのために使われるのが、例外処理です。もちろん、Rubyでも例外処理が組み込まれています。
まずは、例外処理の基本と、Rubyにおける例外処理について紹介します。
例外処理とは何か
どんなに優れたシステムでも、そのプログラムが実行された際、開発者が意図した入力で動作するとは限りません。意図しない入力で、エラーが発生することはよくあります。しかし、そのエラーで、プログラムが強制的に停止したらどうなるでしょうか。
そのプログラムが停止するばかりではなく、関連したサービスが使えなくなります。さらに、そのエラーの原因が解らなければ悪い評判が立ち、利用者離れを招いてしまいます。利用者に、正しい操作を示すか、開発者への連絡しもらい、修正しなければなりません。
そのため、例外処理を使い、プログラムを強制停止せずに、エラーの原因を表示する処理を実装するのが一般的です。
Rubyの例外処理
JavaやC++などの他のプログラミング言語では、例外処理のためにtry~ctachが使われますが、rubyの例外処理は、begin~rescue~endです。
そして、Rubyの例外処理の使い方は、beginの次に検査対象となるプログラムを記述し、rescueの次に先ほどのプログラムで例外処理が発生した場合の処理を記述します。
また、Rubyで発生する例外には複数のエラータイプがあるので、どのエラータイプが発生したかによってrescueの処理を切り替えることも可能です。
beginを省略した書き方も可能
Rubyでは、クラスやモジュール、メソッド定義の中に限り、beginを省略し、rescueだけのブロックだけで例外処理を書くことも可能です。なお、このbeginを省略した書き方は、後で例を紹介しながら詳しく解説します。
Rubyを学びたい方におすすめのスクールはこちら
begin~rescue~endの文法
例外処理が記述可能なプログラム言語は複数ありますが、その基本は、例外が発生する処理をブロックで囲い、それに続くブロックで例外が発生した場合の処理を記述します。そして、この書き方は、Rubyでも同じです。
Rubyにおける例外処理の書き方の基本は次のとおりです。
begin
例外の発生をチェックする対象となるプログラム
rescue
例外が発生した場合の処理
end
また、エラータイプを指定して、複数の例外処理を記述することも可能です。
begin
例外の発生をチェックする対象となるプログラム
rescue エラータイプ
指定したエラータイプの例外が発生した場合の処理
rescue エラータイプ
指定したエラータイプの例外が発生した場合の処理
end
また、例外処理が発生しなかった場合の処理と、例外が発生してもしなくても実行する処理を、beginの下に書くこともできます。
begin
例外の発生をチェックする対象となるプログラム
rescue
例外が発生した場合の処理
else
例外が発生しない場合の処理
ensure
例外に関係なく実行する処理
end
開発者が意図しない操作によってエラーが発生した場合、例外処理が無ければ実行途中で強制停止してしまい、利用者には何が起きたか解りません。しかし、例外処理、および、例外に関係なく実行される処理を記述しておくことで、何が起きたか利用者に知らせ、また、その場合の手順などを表示することが可能です。
Rubyを学びたい方におすすめのスクールはこちら
Rubyの例外処理の例
次に、Rubyの例外処理の例を紹介します。
puts "開始" begin num = gets.strip() out = 100 / num rescue puts "エラー:数字を入力してください" else puts "100 / #{num} = #{out}" ensure puts "終了" end
この例は、例外処理の有無に関係なく、実行直後に「開始」、終了時に「終了」を表示し、例外が発生したらエラーメッセージを、また、正常だったら入力された数字を使った計算式を表示します。
beginで始まる例外処理を使わない、下記のプログラムでは、例外が発生した箇所でプログラムが停止してしまいます。
beginを使わない例とその実行結果 $ cat sample_err.rb puts "開始" num = gets.strip() out = 100 / num.to_i puts "100 / #{num} = #{out}" puts "終了" $ ruby sample_err.rb 開始 Traceback (most recent call last): 1: from sample_err.rb:3:in '' sample_err.rb:3:in `/': divided by 0 (ZeroDivsionError)
この例では、numに数字が入力されなかったことで、100/0による例外(ZeroDivsionError)が発生し、そこでプログラムが強制停止されてしまいました。
しかし、先ほどのbeginを使った例であれば、例外処理と例外に関係ない処理も実行するので、次のように表示されます。
$ruby sample_ok.rb 開始 エラー:数字を入力してください 終了
beginを省略した書き方
これまで、beginから始まるRubyの例外処理について解説してきましたが、先ほど簡単に触れたように、条件次第ではbeginを省略した書き方が可能です。つまり、beginを書かずに、rescueから始まる例外処理と、ensureから始まる例外の有無に関係なく実行する処理のみでも記述できます。
ただし、クラスやモジュール、メソッド定義の中など記述できる場所に制限があるので、注意してください。例えば、次のようなメソッドの中に記述した例外処理は、beginを省略した書き方が可能です。
メソッドの中に記述した例外処理の例 def sample puts "開始" begin num = gets.strip() out = 100 / num rescue puts "エラー:数字を入力してください" else puts "100 / #{num} = #{out}" ensure puts "終了" end end
メソッドの中に記述し、beginを省略した例外処理の例 def sample puts "開始" num = gets.strip() out = 100 / num rescue puts "エラー:数字を入力してください" else puts "100 / #{num} = #{out}" ensure puts "終了" end
この場合、メソッドの中で例外が発生した場合、rescueおよびensureのブロック内に記述した内容を処理できます。
Rubyを学びたい方におすすめのスクールはこちら
まとめ
これまで説明したように、Rubyには、begin~rescue~endのブロックを使った例外処理の記述が可能です。さらに、elseやensureを組み合わせることで、例外が発生しなかった場合の処理や、例外の有無に関係なく実行する処理なども書けます。また、クラスやモジュール、メソッドの中ではbeginの省略も可能です。ぜひ、beginを使った、Rubyの例外処理の書き方をマスターしてください。
また、Rubyについてもっと詳しく学びたい方は、ポテパンキャンプの利用を検討されてはいかがでしょうか。
Rubyを学びたい方におすすめのスクールはこちら