LoginSignup
0
0

More than 5 years have passed since last update.

[Ruby][初心者] 例外処理について

Posted at

例外とは?

プログラムのエラーにより継続して処理ができない異常
例外が起きると途中で処理が止まってしまうため、例外が起きる可能性がある場所においては適切に例外処理を行う必要がある

例外が発生する可能性のある箇所を 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ブロックで行なった処理の後処理が必要な場合に使用される

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0