Hatena::Grouprubyist

Going My Ruby Way このページをアンテナに追加 RSSフィード

Ruby ロゴ (C) Ruby Association LLC

2010年11月12日(金)

大域脱出 catch/throw

| 22:19 | 大域脱出 catch/throw - Going My Ruby Way を含むブックマーク はてなブックマーク - 大域脱出 catch/throw - Going My Ruby Way 大域脱出 catch/throw - Going My Ruby Way のブックマークコメント

"手続き型"オブジェクト指向スクリプト言語 Ruby

def foo1
    puts "foo1"
    throw :tag, 25        # catch(:tag) の次へ
end

def foo2
    puts "foo2"
    foo1                  # foo1 へ
end

ret = catch(:tag) do
  puts "catch"
  foo2                    # foo2 へ
end
# throw :tag の後はここから
puts ret
puts "bye"
(実行結果)
catch
foo2
foo1
25                       # throw の 2番目の引数が catch の戻り値
bye

rescue と raise

| 21:55 | rescue と raise - Going My Ruby Way を含むブックマーク はてなブックマーク - rescue と raise - Going My Ruby Way rescue と raise - Going My Ruby Way のブックマークコメント

rescue

rescue 節の例外タイプの指定を省略した場合は、StandardError を指定したと解釈される。

>> begin
?> raise StandardError
>> rescue
>> puts "-"
>> rescue StandardError
>> puts "StandardError"
>> ensure
?> puts "ensure"
>> end
-
ensure
=> nil
>> begin
?> raise Exception
>> rescue
>> puts "-"
>> rescue StandardError
>> puts "StandardError"
>> ensure
?> puts "ensure"
>> end
ensure
Exception: Exception
	from (irb):11
>> 

例外の既定クラスは ExceptionStandardError はその派生クラス。

rescue 句

>> 10 / 0 rescue puts "zero divided."
zero divided.
=> nil
>> 10 / 0 rescue nil
=> nil

raise

raise は例外クラスを指定しないと RuntimeError を発生させる。

RuntimeErrorStandardError の派生クラス。

begin
  raise "error happend"
rescue RuntimeError
  puts "RuntimeError"
rescue StandardError
  puts "StandardError"
rescue Exception
  puts "Exception"
ensure
  puts "ensure"
end
(実行結果)
RuntimeError
ensure

SystemExit も rescue で補足できる

SystemExitException の派生クラス。

begin
  exit                # raise SystemExit も同じ
rescue RuntimeError
  puts "RuntimeError"
rescue StandardError
  puts "StandardError"
rescue SystemExit
  puts "SystemExit"
ensure
  puts "ensure"
end
(実行結果)
SystemExit
ensure