例外を捕捉する(rescue)
たとえばDateオブジェクトをnewする時、存在しない日付を渡してやると ArgumentError: invalid date
が発生します。ArgumentErrorは、Exception
から見ると Exception > StandardError > ArgumentError
という孫の位置に当たります。
Date.new時のこの例外を捕捉して「とりあえず失敗したら今日のDateオブジェクトを作成する」という方法で「助け舟」を出してやりましょう。助け舟をあらかじめ用意してやることを「例外を捕捉」すると言います。例外を捕捉するためには、エラーが発生する可能性のある領域をbegin ... end
で囲ってやり、例外が発生した場合の処理を rescue
以下に記述します。
raise => e
とすることで、例外オブジェクトをe
という変数に束縛しています。ログに例外の詳細を吐き出しつつ、とりあえずプログラムはDate.today
の値を使って続行させることが出来ます。
rescueする際に例外クラスを指定することで、特定の例外のみ捕捉させることができます。また、rescue節は複数設置可能です。ここでrescue指定した例外クラスの「すべての子」も補足対象となることに注意してください。たとえばrescue StandardError
とすれば、StandardErrorを継承しているIOErrorやRangeErrorなども捕捉対象となります。以下に例を示します。
必ず実行させる(ensure)
begin内の実行が成功しようが失敗しようが、必ず実行させたいタイプの処理があります。たとえばbegin内でファイルをオープンしたので、処理を片付ける前に必ず閉じておきたい、というような場合です。
そういう場合はensure節を書いておくことで、begin内が成功した場合も、失敗してrescueに補足された場合も必ず実行されることが保証されます。
例外を発生させる(raise)
さて、ここまではRubyが発生させるエラーのみを扱って来ました。プログラム中で意図的に例外を発生させる場合、Kernel#raise
メソッドを使います。
引数にメッセージのみ指定する場合、RuntimeErrorが発生します。これはException > StandardError > RuntimeError
というに位置する例外クラスです。raiseに引数として例外クラスを渡すことで、RuntimeError
以外の例外を発生させることができます。これは独自に定義した例外クラスでも構いません。
最後のページでは、いくつか例外処理の実例を示したいと思います。