例外も忘れてた。

ウィルコムストアで購入したW-ZERO[es]が未だに出荷去らずにもやもや、もんもん。それでもキャラバンは進むし、Rubyの勉強も進む、というわけで例外処理。
基本。

begin
  raise "逃げろー"
rescue => exp
  printf("%s:%s?n", "rescue", exp.to_s)
ensure
  puts "ensure"
end

結果。

rescue:逃げろー
ensure

私が一番理解しているつもりのC#に例えるなら、

C# Ruby
try begin
catch rescue
finally ensure

という感じのようだ。
例外の種類によって処理を分ける。

begin
  raise SyntaxError.new("シンタックスエラーだよー")
rescue SyntaxError => exp
  printf("%s:%s?n", "SyntaxError", exp.to_s)
rescue => exp
  p exp
end

結果。

SyntaxError:シンタックスエラーだよー

別の例外を発生させ、例外の種類を指定していないrescue節を通してみる。

begin
  raise IOError.new("IOエラーだよー")
rescue SyntaxError => exp
  printf("%s:%s?n", "SyntaxError", exp.to_s)
rescue => exp
  printf("%s:%s?n", "何の例外かな?", exp.to_s)
end

結果。

何の例外かな?:IOエラーだよー

こんなのもある。

begin
  puts "例外が発生するかも?"
rescue
  puts "発生しました。"
else
  puts "発生しませんでした。"
ensure
  puts "発生してもしていなくても関係ありません。"
end

elseは例外が発生しなかった場合に行われるので、結果は、

例外が発生するかも?
発生しませんでした。
発生してもしていなくても関係ありません。

となる。
例外を発生させてみる。

begin
  raise
rescue
  puts "発生しました。"
else
  puts "発生しませんでした。"
ensure
  puts "発生してもしていなくても関係ありません。"
end

結果。

発生しました。
発生してもしていなくても関係ありません。


Rubyレシピブック 268の技

Rubyレシピブック 268の技