読者です 読者をやめる 読者になる 読者になる

Rubyで例外処理

基本の「き」

begin
  <<例外が起こる可能性のある処理>>
rescue => <<例外オブジェクトが代入される変数>>
    <<例外が発生したときの処理>>
else
    <<例外が発生しなかったときに実行される処理>>
ensure
    <<例外の発生有無に関わらず最後に必ず実行する処理>>
end

begin
    num = 10 / 0
rescue => e
    p "#{e.class} : #{e.message}"
else
    p num
ensure
    p "実行しました"
end

実行結果

"ZeroDivisionError : divided by 0"
"実行しました"

例外ごとに処理を変更する

begin
    # num = 10 / "a"
    num = 10 / 0
rescue ZeroDivisionError
    p "ゼロで割ろうとしたぞい"
rescue TypeError
    p "型でエラーだぞい"
rescue => e
    p "#{e.class} : #{e.message}"
end

実行結果

"ゼロで割ろうとしたぞい"

例外処理の後に処理をやり直す

rescueの中にretryを入れる

num = 0
begin
    sum = 10 / num
rescue
    num += 1
    retry
else
    p num
ensure
    p "実行しました"
end

実行結果

1
"実行しました"