ようへいの日々精進XP

よかろうもん

2018 年 06 月 07 日 (木)

ジョギング

日課

  • (腕立て x 50 + 腹筋 x 50) x 3

体が

  • 色々痛い
  • 足もそうだし, 首筋とか痛みがある

今日のるびぃ ~ REx - Ruby Examination にチャレンジ (21) ~

REx - Ruby Examination の問題を自分なりにアレンジした上で 1 〜 3 問くらいずつ解いていく. 正直言ってかなり難しい. 尚, irb に動作確認環境は以下の通り.

$ ruby --version
ruby 2.1.10p492 (2016-04-01 revision 54464) [x86_64-linux]
$ irb --version
irb 0.9.6(09/06/30)

例外, raise, RuntimeError

以下のコードを実行するとどうなるか.

begin
  raise
rescue => e
  puts e.class
end

RuntimeError と表示される

以下, irb による確認.

irb(main):001:0> begin
irb(main):002:1*   raise
irb(main):003:1> rescue => e
irb(main):004:1>   puts e.class
irb(main):005:1> end
RuntimeError
=> nil

以下, 解説より抜粋.

  • 引数無しで raise を呼び出すと RuntimeError が発生する
irb(main):006:0> raise
RuntimeError: 

確かに. 尚, raise に例外クラスを引数として渡すと, RuntimeError 以外の例外クラスで例外を発生させることが出来る.

irb(main):001:0> raise
RuntimeError: 
..
irb(main):002:0> raise StandardError
StandardError: StandardError
..
irb(main):004:0> raise NameError
NameError: NameError
..
irb(main):005:0> raise TypeError
TypeError: TypeError

更に例外

以下のコードを実行するとどうなるか.

begin
  raise "Error!"
rescue => e
  puts e.class
end

RuntimeError が表示される

以下, irb による確認.

irb(main):001:0> begin
irb(main):002:1*   raise "Error!"
irb(main):003:1> rescue => e
irb(main):004:1>   puts e.class
irb(main):005:1> end
RuntimeError
=> nil

以下, 解説より抜粋.

  • raise の例外クラスを省略した場合は, RuntimeError が発生する
  • rescue の例外クラスを省略した場合は, StandardError を捕捉する
  • RuntimeErrorStanderdError のサブクラスである

以下, StandardError クラスのドキュメントより引用.

通常のプログラムで発生する可能性の高い 例外クラスを束ねるためのクラスです。 StandardError とそのサブクラスは、 rescue 節でクラスを省略したときにも捕捉できます。

rescue 節で明示的に例外クラスを指定しなかった場合には, StandardError クラスに属する例外クラスを捕捉する.

# 以下のように書くと StandardError クラスの例外クラスであれば, rescue 節で捕捉する
begin
  raise
rescue => e
  e.class
end

以下, RuntimeError クラスの親クラスを確認するスクリプトirb で実行した例.

irb(main):001:0> subclass = RuntimeError
=> RuntimeError
irb(main):002:0> 
irb(main):003:0* loop do
irb(main):004:1*   superclass = subclass.superclass
irb(main):005:1>   p superclass
irb(main):006:1>   subclass = superclass
irb(main):007:1>   break if superclass == Object
irb(main):008:1> end
StandardError
Exception
Object
=> nil

上記のコードは, 8-1-2 例外処理と例外クラスを理解するプログラムを記述してみよう より引用させて頂いた.

フムフム.