はじめに
Rubyの基本文法 「例外処理」についてのご紹介です。
基本文法シリーズは今回でラストです。
目次
例外処理
プログラム動作における例外発生時に行う処理のことです。
Rubyでの例外処理の方法としては、begin, rescue, raise があります。
begin
-
数値を0で割る計算はできないので例外となり、フォーマット
begin 実行するコード rescue 例外発生時に実行されるコード endrescue内のコードが実行されます。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 例外が発生しなかった時に実行されるコード endbegin p "テスト" rescue p "例外発生" else p "例外発生なし" end実行結果"テスト" "例外発生なし"
rescue
ensure構文(例外の有無に関わらず最後に実行したいコード)を加えることもできます。
-
フォーマット
begin 実行するコード rescue 例外発生時に実行されるコード else 例外が発生しなかった時に実行されるコード ensure 例外の有無にかかわらず最後に実行されるコード endbegin p "テスト" rescue p "例外発生" else p "例外発生なし" ensure p "プログラム終了" end実行結果"テスト" "例外発生なし" "プログラム終了"
raise
raiseは、例外を意図的に起こしたい場合に使用します。
-
フォーマット
raisebegin 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: 例外のテスト>※ 上記ですが「例外の種類」を消して「例外のメッセージ」のみの指定も可能です。
例外のやり直しも可能です。
フォーマットretrycount = 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実行結果"例外発生"