例外(エラー)処理

2003年3月 堀之内 武
2004年3月 西澤 誠也


例外

期待しない状況がが生じると例外が上がるります。 例外が発生すると通常はプログラムは終了し、メッセージが出力されます。
exception1.rb

%ruby exception1.rb
exception1.rb:3:in `[]': index out of range (IndexError)
        from exception1.rb:3:in `p_4'
        from exception1.rb:6
上のように、デフォルトでは実行が中断され、トレースバックが表示されます。 呼出しをさかのぼってファイル名と行番号が表示されます。

自分で例外が上がるようにもできます。
exception2.rb

%ruby exception2.rb
16
exception2.rb:5:in `power': x must be a kind of Numeric (RuntimeError)
        from exception2.rb:9
Numeric===xxが数値オブジェクトであるかどうかを調べます。
raise は例外を発生するグローバルメソッドです。 数値以外の場合は例外が上がるようになっています。

ある程度エラーが予測されている場合は、 エラー時終了せず、適切な対処したいということがあるでしょう。 以下のように、 begin .. rescue .. [else] .. end、 を使うと例外を捕捉し、rescue以下の部分を実行します。
exception3.rb

%ruby exception3.rb
"2010"

例外を捕捉したときだけその下を実行する rescue に加えて、例外が発生しようがし まいが必ず実行する ensure というのもあります。これも begin .. ensure .. end の形で使います。
exception4.rb

%cat hello.txt
Hello World!
%ruby exception4.rb
["Hello World!\n", "file is end"]

例外処理をうまく使うことで、 まさに「例外的な状況」に強いプログラムを作ることが出来ます。 汎用なプログラムをつくるためには、必須の機能です。 なお、軽微な例外的状況への対応のしかたとしては、 メソッドの戻り値を本来戻すべきクラスのオブジェクトでなく nil を返すという方法も良く使われます。例えば
irb(main):001:0> a = [10,20]
=> [10, 20]
irb(main):002:0> a[1]
=> 20
irb(main):003:0> a[2]
=> nil


return