8-1-2 例外処理と例外クラスを理解するプログラムを記述してみよう
基本的な例外処理のプログラムを記述し保存する
以下のようにプログラムを記述し、ファイル名をexception1.rb
で保存します。
begin p a rescue => e p e ensure p 'begin block is end.' end
例外処理のプログラムを実行する
コマンドライン上で保存したプログラムを指定して実行します。実行結果にNameError
、"begin block is end."
が表示されます。
$ ruby exception1.rb #<NameError: undefined local variable or method `a' for main:Object> "begin block is end."
例外が発生しないプログラムを記述し保存する
以下のようにプログラムを記述し、ファイル名をexception2.rb
で保存します。
a = 1 begin p a rescue => e p e ensure p 'begin block is end.' end
例外が発生しないプログラムを実行する
コマンドライン上で保存したプログラムを指定して実行します。実行結果に1
、"begin block is end."
が表示されます。
$ ruby exception2.rb 1 "begin block is end."
捕捉する例外クラスを指定したプログラムを記述し保存する
以下のようにプログラムを記述し、ファイル名をexception3.rb
で保存します。
begin a rescue NameError => e p e ensure p 'begin block is end.' end
捕捉する例外クラスを指定したプログラムを実行する
コマンドライン上で保存したプログラムを指定して実行します。実行結果にNameError
、"begin block is end."
が表示されます。
$ ruby exception3.rb #<NameError: undefined local variable or method `a' for main:Object> "begin block is end."
存在しないメソッドを使ったプログラムを記述し保存する
以下のようにプログラムを記述し、ファイル名をexception4.rb
で保存します。
begin 1.no_exist_method rescue NoMethodError => e p e ensure p 'begin block is end.' end
存在しないメソッドを使ったプログラムを実行する
コマンドライン上で保存したプログラムを指定して実行します。実行結果にNoMethodError
、"begin block is end."
が表示されます。
$ ruby exception4.rb #<NoMethodError: undefined method `no_exist_method' for 1:Integer> "begin block is end."
例外が発生した処理を繰り返すプログラムを記述し保存する
以下のようにプログラムを記述し、ファイル名をexception5.rb
で保存します。
exception_count = 0 begin p a rescue => e exception_count += 1 p e retry if exception_count < 3 ensure p 'begin block is end.' end
例外が発生した処理を繰り返すプログラムを実行する
コマンドライン上で保存したプログラムを指定して実行します。実行結果にNameError
が3回表示された後、"begin block is end."
が表示されます。
$ ruby exception5.rb #<NameError: undefined local variable or method `a' for main:Object> #<NameError: undefined local variable or method `a' for main:Object> #<NameError: undefined local variable or method `a' for main:Object> "begin block is end."
NoMethodError
クラスの親クラスを確認するプログラムを記述し保存する
以下のようにプログラムを記述し、ファイル名をexception6.rb
で保存します。
subclass = NoMethodError loop do superclass = subclass.superclass p superclass subclass = superclass break if superclass == Object end
NoMethodError
クラスの親クラスを確認するプログラムを実行する
コマンドライン上で保存したプログラムを指定して実行します。実行結果にNameError
、StandardError
、Exception
、Object
が表示されます。
$ ruby exception6.rb NameError StandardError Exception Object