memorandum

IT技術の習得を記録します

エラー回避 rescue

rescueを使うことによって、エラーを回避して処理ができる
beginとrescueの間で実行する処理で何らかのエラーが発生しても処理を中断しないようになる

begin
  例外を発生させる可能性のある処理
rescue
  例外が起こった場合の処理
end

rescueに続けて変数名を指定、上がってきた例外が指定した変数に代入される

begin
  例外が起こる可能性のある処理
rescue => 例外オブジェクトが代入される変数
  例外が起こった場合の処理
end

raiseで意図的に例外を発生させてみる
raiceは検証に便利
数に型を渡さないと、 RuntimeErrorを発生させる
RuntimeError : 特定の例外クラスには該当しないエラー

begin
  raise 
rescue => e
  p "error"
end

結果

"error"

rescueのあとにクラスを指定すると、その例外のときのみ処理を中断しないようになる

begin
  raise StandardError
rescue StandardError => e
  p "StandardErrorが発生していますが処理は中断していません"
end

結果

"StandardErrorが発生していますが処理は中断していません"

指定した以外のエラーが発生すると

begin
  raise ArgumentError
rescue ZeroDivisionError => e
  p "ZeroDivisionErrorが発生していますが処理は中断していません"
end

結果

csv_test.rb:2:in `<main>': ArgumentError (ArgumentError)||<


例外オブジェクトからメソッドを呼んで、例外に関する情報を取得できる。

class ... 例外の種類
message ... 例外のメッセージ
backtrace ... 例外の発生した位置に関する情報($@ = $!.backtrace)

begin
  raise StandardError
rescue StandardError => e
  p "StandardErrorが発生していますが処理は中断していません"
  p e.class
end
"StandardErrorが発生していますが処理は中断していません"
StandardError