○ 例外処理
実行時に発生する問題に地王
プログラムを安定して動作させる
システムの品質を高める
・発生しうる例外(例外 = 実行時エラー)
→ゼロで割り算 ZeroDivisionError
→未定義の変数の呼び出し NameError
→数値変換で、数字ではない文字を指定 TypeErrp
→配列の範囲外にアクセス NoMethodError (NoNameErrorを継承したもの)
→ファイルが存在しない
→オブジェクトがnull
→引数が不正
→すべての例外に対応 ExceptionError (Exceptionはスーパークラスその他はサブクラスとなる)
———————————————————
begin
→予めコードを指定して、プログラム実行時に処理の問題を検出
rescue
→問題を検出したとき、どのように対応するか記述しておく。beginブロックの中で例外処理を見つけたら、rescueの中身が実行される。
raise
→対応を記述していない場合、メソッドの呼び出し元に対応を任せる。また、例外が発生していない状況でも例外処理を起動することができる。raise Exception.new
ensure
→ensureが記述されている場合には、例外が起こっていてもいなくてもensure以下を実行する
———————————————————
begin
number = 0
answer = 100 / number
puts answer2
raise ExceptionError
puts "予期せぬエラーが発生しました"
rescue ZeroDivisionError => e
puts "0では割り算できません"
p e
rescue NameError => e
puts "未定義の変数を呼び出しています"
p e
rescue ExceptionError => e
STRERR.puts “強制的にエラーを起こしました”
ensure
# 実行文
end
———————————————————
def test_exception(number)
puts 2
begin
puts 3
answer = 100 / number
return answer
puts 4
rescue ZeroDivisionError => e
puts 5
raise e
end
puts 6
end
begin
answer = test_exception(0)
puts 7
rescue ZeroDivisionError => e
puts 8
p e
end
作成したメソッドの中で例外が発生した場合には、その呼び出し元に例外が伝わる
def test_exception(number)
puts 2
begin
puts 3
answer = 100 / number
return answer
puts 4
rescue ZeroDivisionError => e
puts 5
raise e
ensure
puts 6
end
end
puts 1
begin
answer = test_exception(0)
puts 7
rescue ZeroDivisionError => e
puts 8
p e
end