Rubyの例外処理を完全攻略!raiseやrescueの使い方を初心者向けに徹底解説
生徒
「Rubyでプログラムを実行しているときに、急にエラーが出て止まってしまうことがあります。これを防ぐ方法はありますか?」
先生
「それは『例外処理』という仕組みを使えば解決できます。Rubyでは、raiseやrescueといった命令を使って、エラーが起きてもプログラムを安全に動かし続けることができるんですよ。」
生徒
「例外処理……難しそうな名前ですね。パソコンをあまり触ったことがない私でも理解できるでしょうか?」
先生
「大丈夫です!日常生活のトラブル対応に例えると非常に分かりやすいですよ。基本から順番に、正しい使い方を見ていきましょう!」
1. 例外処理とは?エラーを怖がらないための基礎知識
プログラミングをしていると、必ず「エラー」に遭遇します。例えば、数字をゼロで割り算しようとしたり、存在しないファイルを読み込もうとしたりすると、プログラムは「どうすればいいかわからない!」とパニックを起こして強制終了してしまいます。このパニック状態のことをプログラミング用語で例外(れいがい)と呼びます。
例外処理とは、このパニックが起きたときに「落ち着いて、代わりにこの処理をしてね」とあらかじめ指示を出しておく予備動作のことです。Rubyでは主にbeginからendまでのブロックの中に、エラー対策のコードを書いていきます。
これを日常生活で例えるなら、「もし外出中に雨が降ってきたら(例外発生)、傘をさす(対処法)」というルールを決めておくようなものです。ルールが決まっていれば、雨が降ってもパニックにならずに済みますよね。Rubyの例外系制御(raise, rescue, retry, ensure)をマスターすれば、途中で止まらない丈夫なプログラムが作れるようになります。
Rubyの文法を基礎からしっかり固めたい人や、 現場で役立つ「テスト駆動開発」の考え方まで身につけたい人には、 評価の高いこの一冊がおすすめです。
プロを目指す人のためのRuby入門をAmazonで見る※ Amazon広告リンク
2. rescueでエラーを捕まえて対処する方法
まずは、エラーが起きたときにプログラムを止めないための最も基本的な命令、rescue(レスキュー)について学びましょう。名前の通り、エラーからプログラムを救出するためのものです。
基本的な形は、beginで処理を開始し、エラーが起きそうな場所にrescueを置きます。もしエラーが発生しなければrescueの中身は無視され、エラーが発生したときだけ実行されます。
begin
# ゼロで割り算をする(エラーが起きる処理)
number = 10 / 0
puts "計算結果は #{number} です"
rescue
# エラーが起きたときに実行されるレスキュー隊
puts "エラーが発生しました!ゼロで割ることはできません。"
end
このコードを実行すると、本来ならエラーで止まるはずの場所でrescueが発動し、画面にメッセージを出した後にプログラムを安全に終了させます。エラーをキャッチするという感覚を掴むことが大切です。
3. raiseを使って意図的に例外を発生させる
次に紹介するのはraise(レイズ)です。これは、プログラムの中で「ここでエラーを発生させなさい!」と自分から命令を出すときに使います。
「わざとエラーを出すなんて変だな」と思うかもしれませんが、これは非常に重要なテクニックです。例えば、ユーザーが入力した年齢がマイナスだった場合、計算を続けるのはおかしいですよね。そんなときにraiseを使って、異常態勢であることをシステムに知らせます。
def check_age(age)
if age < 0
# 意図的にエラーを発生させる
raise "年齢にマイナスの値は入力できません!"
end
puts "あなたの年齢は #{age} 歳ですね。"
end
begin
check_age(-5)
rescue => e
# 発生したエラーのメッセージを表示する
puts "エラーの内容: #{e.message}"
end
ここではrescue => eという書き方を使っています。これにより、raiseで投げたメッセージが変数eの中に入り、後から内容を確認できるようになります。
4. retryで処理をもう一度やり直す仕組み
エラーが起きたとき、ただ諦めるのではなく「もう一度だけ試してみたい」という場合があります。例えば、インターネットの接続が一瞬切れてしまったときなどは、数秒待ってからやり直せば成功するかもしれません。そんな時に使うのがretry(リトライ)です。
retryが呼ばれると、Rubyはbeginの最初に戻って処理をやり直します。ただし、無限にやり直すとプログラムが永遠に終わらなくなるので、回数を決めて使うのが一般的です。
attempts = 0
begin
attempts += 1
puts "#{attempts}回目の挑戦です。"
# 3回目まではわざと失敗させる
if attempts < 3
raise "まだ接続できません"
end
puts "無事に成功しました!"
rescue => e
if attempts < 5
puts "エラーが起きたのでやり直します: #{e.message}"
# beginの最初に戻る
retry
else
puts "何度も失敗したので諦めます。"
end
end
この仕組みを使えば、一時的なトラブルに対して非常に柔軟に対応できる、粘り強いプログラムが書けるようになります。
5. ensureで何があっても必ず実行する後処理
例外処理の最後を飾るのがensure(エンシュア)です。これは、エラーが起きようが起きまいが、絶対に最後に実行されるコードを書くための場所です。
例えば、ファイルを開いて中身を読み込むプログラムを考えてみましょう。読み込み中にエラーが起きても、開いたファイルは最後には必ず閉じなければなりません。もし閉じ忘れると、パソコンのメモリを無駄に使い続けてしまう原因になります。
begin
puts "ファイルを開きます。"
# 何か難しい処理をすると仮定
raise "処理中にトラブル発生!"
rescue
puts "トラブルを解決しました。"
ensure
# エラーの有無に関わらず、必ず実行される
puts "最後に必ず後片付けをします。"
end
このensureのおかげで、大切な「後片付け」を確実に終わらせることができ、プログラムの信頼性がぐっと高まります。
6. 特定のエラーだけを捕まえる賢い書き方
これまではどんなエラーも一括でrescueしてきましたが、実は「ゼロ除算のエラーだけ対処したい」「ファイルが見つからないエラーだけ対処したい」といった具合に、エラーの種類を指定することができます。
これを例外クラスの指定と呼びます。Rubyには最初から様々なエラーの種類が定義されています。特定の名前を指定することで、その種類のトラブルにだけ特化したレスキュー隊を派遣できるのです。
- ZeroDivisionError:ゼロで割ったとき
- NoMethodError:存在しない命令を呼び出したとき
- RuntimeError:一般的なエラー
適切なエラーを指定することで、予期せぬ大きな不具合を隠してしまう心配がなくなり、より正確なデバッグ(間違い探し)ができるようになります。
7. 例外処理を使うときの注意点とマナー
例外処理は非常に強力ですが、何でもかんでもrescueで囲めばいいというわけではありません。初心者が陥りがちなのが、「原因がわからないけど、とりあえずエラーが出るからrescueで隠しちゃえ」という考え方です。
エラーを無理やり隠してしまうと、プログラムが間違った動きをしていることに気づけなくなり、後で取り返しのつかない大きな問題に発展することがあります。これを例外の握りつぶしと呼び、プログラミングの世界では避けるべき悪い習慣とされています。
例外処理を使うのは、「どうしても避けられない外部要因(ネットが切れる、ファイルが消えている等)」や「エラーが起きたときの正しい対処法が決まっているとき」だけに絞るのが、上級者への近道です。
8. 実践編:例外処理を組み合わせて使ってみよう
最後に、これまで学んだbegin, rescue, ensureをすべて使った、より実践的なコードを見てみましょう。一見複雑に見えるかもしれませんが、一つ一つの部品の役割を思い出せば大丈夫です。
def process_data(value)
begin
puts "--- 処理を開始します ---"
if value == nil
raise "データが空っぽですよ!"
end
result = 100 / value
puts "計算に成功しました: #{result}"
rescue ZeroDivisionError
puts "エラー対処:ゼロでは割れません。"
rescue => e
puts "その他のエラー対処:#{e.message}"
ensure
puts "--- 処理が終了しました(必ず実行) ---"
end
end
# 正常な実行
process_data(10)
# ゼロ除算エラーの実行
process_data(0)
# raiseで指定したエラーの実行
process_data(nil)
このように役割を分担させることで、どんな事態が起きても動じない、プロフェッショナルなプログラムの土台が出来上がります。
9. コンピュータの気持ちになって考える重要性
プログラミングの初心者にとって、エラー画面は怖いものに見えるかもしれません。しかし、例外処理を学んだ今のあなたなら、エラーを「コンピュータからの親切なお知らせ」として捉えることができるはずです。
「このまま動かすとパソコンが壊れるから止まるね」と教えてくれるのが例外です。それに対して「教えてくれてありがとう、じゃあこう対処するよ」と返すのが例外系制御の役割です。
raiseやrescueを正しく使いこなすことは、コンピュータとのコミュニケーションをより深く、円滑にすることに他なりません。最初は失敗しても構いません。何度も例外を発生させては救出する練習を繰り返して、Rubyという言葉に慣れていってくださいね。