(Ruby) Rubyの例外処理

リファレンスマニュアルにちゃんと書いてあるじゃないか。

環境

存在しないファイルを開いて例外を発生させてみる

notfound.txtという存在しないファイルを開く。

open("notfound.txt", "r") do |file|
    puts file.readlines
end
    

Errno::ENOENTが発生する。

morningcoffee.rb:1:in `initialize': No such file or directory - notfound.txt (Errno::ENOENT)
    

例外が発生したことをメッセージで出力してみる

rescue節を使って例外を補足する。

begin
    open("notfound.txt", "r") do |file|
        puts file.readlines
    end
rescue
    puts "例外が発生した"
end
    

発生した例外ではなくて、rescue節のメッセージが出力される。

例外が発生した
    

発生した例外の内容をメッセージで出力してみる

組み込み変数の$!を使う。

begin
    open("notfound.txt", "r") do |file|
        puts file.readlines
    end
rescue
    puts $!
end
    

$!に格納されている例外の内容が出力される。

No such file or directory - notfound.txt
    

例外の発生した場所をメッセージで出力してみる

組み込み変数の$@を使う。

begin
    open("notfound.txt", "r") do |file|
        puts file.readlines
    end
rescue
    puts $@
end
    

ファイル名、行数、メソッド名が出力される。

morningcoffee.rb:2:in `initialize'
    

例外が発生したときの処理の行方はどうなるのか

rescueするとそれ以降も処理が続くのか?

puts "process start"

begin
    puts "    begin start"

    open("notfound.txt", "r") do |file|
        puts file.readlines
    end

    puts "    begin end"
rescue
    puts "    rescue start"
    puts "        " + $!
    puts "    rescue end"
end

puts "process end"
    

rescueすればそれ以降も処理が続くらしい。

process start
    begin start
    rescue start
        No such file or directory - notfound.txt
    rescue end
process end
    

関連情報

Copyright © 2005, AfternoonTea
All rights reserved.