はじめに
例外処理について勉強しました。
実際の業務だとどんなところで使うんだろうか?
詳しい人教えていただきたいです!
例外とは?
プログラムのエラーにより継続して処理ができない異常
例外が起きると途中で処理が止まってしまうため、例外が起きる可能性がある場所においては適切に例外処理を行う必要がある
例
例外が発生する可能性のある箇所を begin ... rescue で囲む。
例外が発生した場合は、rescueブロックの中の処理が実行される。
begin
val = 10 / 0
put val
rescue
puts '0で割ることはできません'
end
例外に関数情報が入った例外オブジェクトを取得するには次のように書く
begin
val = 10 / 0
put val
rescue => e
p e
end
#<ZeroDivisionError: divided by 0>
=> #<ZeroDivisionError: divided by 0> # 実行結果
例外オブジェクトにはエラーの原因を調べるための便利なメソッドが用意されている
- backtraceメソッド
どのような順序でプログラムが実行されエラーに至ったかという情報を返してくれる
- full_messageメソッド
例外に関する整形されたメッセージを返すメソッド
例外によって処理を分ける
begin
val = 10 / 0
put val
rescue ZeroDivisionError => e
puts '0で割っては行けません';
rescue => e
puts 'その他のエラー'
end
#<ZeroDivisionError: divided by 0>
=> #<ZeroDivisionError: divided by 0> # 実行結果
rescueに入った後に何らかの処理を行いもう一度実行したい場合
retryを使う
retry時にエラーが解消されないコードを書いてしまうと、例外が発生し続け永遠にretryし続けるループに入ってしまう可能性がある
num = 0
begin
p 10 / num
rescue ZeroDivisionError => e
p e
num = 2
retry
end
raiseについて
raiseは明示的に例外を発生させたい時に使うもの
単純にraiseとした場合はRuntimeErrorという例外が発生する
begin
raise
rescue => e
p e
end
raiseの後に書いたクラスの例外を発生させることができる
begin
raise ZeroDivisionError
rescue => e
p e
end
独自で例外クラスを作成することもできる。
その場合は、独自のクラスにStandartErrorクラスを継承させて作る。
class MyError < StandardError; end
begin
raise MyError
rescue => e
p e
end
例外は発生してもしなくても実行されるensure
begin ... rescueの最後にensureを入れることで例外が発生しても、しなくても実行される処理を書くことができる
begin
raise
rescue => e
p e
ensure
puts 'ensureが実行されました。'
end
ensureはbeginブロックで行なった処理の後処理が必要な場合に使用される