Rubyの想定外エラーの処理
Rubyでは想定外エラーといい自分でエラーを起こさす処理ができます。
何故エラーをわざわざ起こさす必要があるのでしょうか?
例えば入力フォームに間違った文字を入力してログインしようとした時にエラーにして処理をさせないようにする時などに必要になります。
【コード】
#想定外エラー
def calc_tax(i)
fail("数値を指定してください。") unless i.instance_of?(Integer)
i * 1.1
end
begin
p calc_tax("あ") #例外発生,rescueへ飛ぶ
p calc_tax(1)
rescue => e #例外はここにやってくる
p e.message #エラーメッセージ
p e.backtrace #エラー箇所
end
p calc_tax(2)
結果
#"数値を指定してください。"
#["c:/Users/user/Desktop/MyPython/Ruby.arb:56:in `calc_tax'", "c:/Users/user/Desktop/MyPython/Ruby.arb:61:in `
#>2.2
【解説】
これは間違った値を入れた時のエラーを出す処理をしてそれを中断せずにその後に正しい値を入れた時に処理をするコードです。
書き方ははこんな感じです。
begin
例外の発生をチェックする対象となるプログラム
rescue
例外が発生した場合の処理
end
fail("数値を指定してください。") unless i.instance_of?(Integer)
i * 1.1
end
failは例外を発生させる処理で、unlessはif文とは逆にfalseかどうかを判定します。
i.instance_of?(Integer)は指定した値が整数かどうかを判定します。
beginの後にエラーかどうかを判定するコードを入れます。
p calc_tax("あ")と数値でなく文字列を入れたからエラーが発生し、rescue => eに飛びます。
p e.message #エラーメッセージ
p e.backtrace #エラー箇所
end
ここの処理でエラーメッセージとエラー箇所を表示します。
一方でp calc_tax(1)はcalc_taxに引数1が入って整数なので正しい処理なのでエラーにならずに
p calc_tax(2)の引数2が変数iに代入されて
i * 1.1で2.2と出力されます。
【結論】
Rubyの想定外エラーはやや難しさはあるかもしれません。
普段の処理で使わなくてもアプリケーションは作れてしまいますし。
unlessはfalse判定、beginでエラー判定、rescueはエラーが出たらここに飛ぶって基本は抑えて起きましょう。
取材やお仕事紹介などはこちらからお気軽にご連絡下さい。
ysa7825@gmail.com