はじめに
Rubyの基本文法 「例外処理」についてのご紹介です。
基本文法シリーズは今回でラストです。
目次
例外処理
プログラム動作における例外発生時に行う処理のことです。
Rubyでの例外処理の方法としては、begin, rescue, raise があります。
begin
-
フォーマット
begin 実行するコード rescue 例外発生時に実行されるコード end
rescue
内のコードが実行されます。def output_exception begin p 1/0 rescue p "例外発生" end end output_exception
実行結果"例外発生"
begin p 1/0 rescue => e p e # 例外情報 p e.class # 例外の種類 p e.message # 例外のメッセージ p e.backtrace # 例外が発生した位置情報 end
実行結果#<ZeroDivisionError: divided by 0> ZeroDivisionError "divided by 0" ["exception.rb:5:in `/'", "exception.rb:5:in `output_exception'","exception.rb:14:in `<main>'"]
else構文
(例外が発生しなかったときだけ実行したいコード)を加えることもできます。フォーマットbegin 実行するコード rescue 例外発生時に実行されるコード else 例外が発生しなかった時に実行されるコード end
begin p "テスト" rescue p "例外発生" else p "例外発生なし" end
実行結果"テスト" "例外発生なし"
rescue
ensure構文
(例外の有無に関わらず最後に実行したいコード)を加えることもできます。
-
フォーマット
begin 実行するコード rescue 例外発生時に実行されるコード else 例外が発生しなかった時に実行されるコード ensure 例外の有無にかかわらず最後に実行されるコード end
begin p "テスト" rescue p "例外発生" else p "例外発生なし" ensure p "プログラム終了" end
実行結果"テスト" "例外発生なし" "プログラム終了"
raise
raise
は、例外を意図的に起こしたい場合に使用します。
-
フォーマット
raise
begin raise rescue p "例外発生" end
実行結果"例外発生"
raise
の後ろに例外の種類を指定することもできます。フォーマットraise 例外の種類
begin raise NameError rescue => e p "例外発生" p e end
実行結果"例外発生" #<NameError: NameError>
例外のメッセージを指定することもできます。
フォーマットraise 例外の種類, 例外のメッセージ
begin raise NameError, "例外のテスト" rescue => e p "例外発生" p e end
実行結果"例外発生" #<NameError: 例外のテスト>
※ 上記ですが「例外の種類」を消して「例外のメッセージ」のみの指定も可能です。
例外のやり直しも可能です。
フォーマットretry
count = 0 begin raise rescue count += 1 p "処理失敗#{count}回目" if count < 3 retry end p "終了" end
実行結果"処理失敗1回目" "処理失敗2回目" "処理失敗3回目" "終了"
メソッド全体へ例外処理を設ける場合、
begin
とend
は省略できます。def test p 1/0 rescue p "例外発生" end test
実行結果"例外発生"