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クラスの親クラスを確認するプログラムを実行する

コマンドライン上で保存したプログラムを指定して実行します。実行結果にNameErrorStandardErrorExceptionObjectが表示されます。

$ ruby exception6.rb
NameError
StandardError
Exception
Object