Rubyがミニツク

あなたのRubyの技術に関するより詳しい知識と理解を増やします。

Ruby入門コース

このコースについて

Rubyのeラーニング研修システムはRailsを使ってWebアプリケーション開発ができる技術者の育成を目指します。 そのため、Railsを扱うことができるだけのRubyの知識を得ることがRuby入門コースの目標となっています。

コンテンツ一覧

ヒント レッスンの名前をクリックすると、その内容を表示します。

次のコンテンツ ホームへ戻る

例外処理の書き方

例外処理を書くには以下のように「begin 〜 rescue 〜 end」を使います。

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

実際に実行した例が以下になります。

month = ["Jan", "Feb", "Mar", "Apr", "May", "Jun",
         "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
wrong_number = [0, 1, 2, 3, 4, 5,
                "6", "7", 8, 9, 10, 11]
wrong_number.each do |num|
  begin
    puts month[num]
  rescue
    next
  end
end

Rubyでは例外もオブジェクトです。例外が発生した時に例外オブジェクトを変数に代入することができます。

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

また、例外オブジェクトのメソッドを使うことによって、発生した例外の情報を知ることができます。

メソッド名 意味
class 例外の種類
message 例外のメッセージ
backtrace 例外の発生した位置に関する情報

実際に実行した例が以下になります。

month = ["Jan", "Feb", "Mar", "Apr", "May", "Jun",
         "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
wrong_number = [0, 1, 2, 3, 4, 5,
                "6", "7", 8, 9, 10, 11]
wrong_number.each do |num|
  begin
    puts month[num]
  rescue => ex
    puts ex.message
    break
  end
end

後処理

例外が起こった場合と起こらない場合の両方で実行したい処理がある時はensureを使います。

begin
  <例外を発生させる可能性のある処理>
rescue => <変数>
  <例外が起こった場合の処理>
ensure
  <例外の有無に関わらず実行される処理>
end

実際に実行した例が以下になります。

begin
  x = 10
  y = "a"
  p x + y
rescue => ex
  puts(ex.message)
ensure
  puts("足し算をしました")
end

rescueを省いてensureだけにすることもできます。

begin
  x = 10
  y = 20
  p x + y
ensure
  puts("足し算をしました")
end

やりなおし

例外処理のrescueでretryを使うことによって、例外が発生した時に処理の実行をやりなおすことができます。

flag = 0
begin
  open("/no/file") do |f|
  end
rescue => ex
  flag += 1
  puts ex.message
  if flag < 3
    retry
  end
end

メソッドでの例外処理の書き方

メソッドの中にも例外処理を書くことができます。

def foo(x, y)
  add = x + y
  sub = x - y
  begin
    mul = x * y
    div = x / y
  rescue => ex
    puts(ex.message)
  ensure
    return add, sub, mul, div
  end
end
foo(10, 0)  # エラーが発生する

メソッドの処理をbegin 〜 rescue 〜 endを使った例外処理ですべて囲む時は、beginとendを省略して書くことができます。

def foo
  <メソッドの本体>
rescue => ex
  <例外処理>
ensure
  <後処理>
end

実際に実行した例が以下になります。

def foo(x, y)
  result = x + y
  return result
rescue => ex
  return x, y
ensure
  if result
    puts "xとyを足した結果は、#{result}でした"
  else
    puts "xとyは足せませんでした"
  end
end

foo(10, 20)
foo(10, "a")

例外が発生したメソッドの中にrescueがない時は、メソッドを呼び出したところまで戻りながら例外処理を探します。

def add(a, b)
  a + b
end

def call_add
  add("a", 1)
end

begin
  call_add()
rescue => ex
  puts(ex.message)
end


次のコンテンツ ホームへ戻る