プログラミング言語Rubyの例外処理はbegin~rescue~end構文に記述します。rescueが他のプログラミング言語の例外処理で使われるcatchにあたる訳ですが、例外クラスを省略できるなどRubyのrescueでは独特の使い方が可能です。今回はrescueを中心にRubyの例外処理の使い方について解説します。
Rubyの例外処理
例外処理とは、プログラムが想定していないデータが入力された場合、プログラムを異常で中断させることなく利用者や管理者に通知する処理に切り替える仕組みです。
今使われているプログラム言語の多くに実装されており、もちろんRubyでも例外処理を記述できます。Rubyの例外処理ではbegin~rescue~end構文を使用しますが、この構文の詳しい使い方を紹介する前に例外処理の基本について解説します。
プログラムにおける例外とは
正常に動作するプログラムでも、そのプログラムが想定していないデータを処理する場合、エラーが発生します。そしてエラーの状況によってはプログラムの実行を継続できず、異常終了により途中で処理を中断します。
とはいえプログラムで処理するデータの仕様は設計時に決めらており、プログラムはそれに従って作られています。そのような設計時に決めておいたデータ以外のデータ、つまり例外が入力されたケースを想定して作られたプログラムが例外処理です。
例外処理の考え方
先ほど紹介したようにプログラムがエラーで異常終了するケースでもプログラムを中断させず、別の処理に切り替えるプログラムが例外処理です。
例外処理では、まずエラー検出対象のプログラムを指定し、そのプログラムでエラーを検出した際に実行する別の処理を記述します。
なおオブジェクト指向言語では標準で組み込まれているメソッドの多くに異常終了を検出する機能が組み込まれているので、エラー検出対象のプログラムにそのまま使えます。また、独自のクラスに例外処理を強制的に呼び出す処理を作ることも可能です。
例外処理の構文
JavaやPHPなどのプログラム言語の例外処理は、エラーがあった場合は例外をthrowし、それをcatchした処理で例外処理を実行するのが基本です。そして例外処理はtryとcatchの構文で、tryに続くプログラムでthrowする処理を記述し、例外処理をctachに続くプログラムに記述します。
Rubyにも例外処理があり書き方も同じですが、tryとcatchではなくbeginとrescueを使います。
Rubyの例外処理の書き方
Rubyの例外処理は先ほど簡単に紹介したようにbeginとrescueを使います。次からberginとrescueを使った例外処理の書き方を紹介します。
begin~rescue~endの基本構文
Rubyの例外処理を記述するには、begin~rescue~end構文を使います。beginとrescueの間に例外が起こるかも知れない処理を記述し、rescueとendの間に例外が発生した時の処理を記述してください。
begin~rescue~endの基本構文
begin
例外が起こるかも知れない処理
rescue
例外が発生した時の処理
end
resucueで例外オブジェクトを利用する
先ほどbegin~rescue~endの基本構文を紹介しましたが、紹介した書き方ではどのようなエラーが発生したのか解りません。
Rubyでは例外が発生すると例外オブジェクトを生成するので、rescueでそれをオブジェトとして受け取ることでエラーの内容を表示することが可能です。
resucureで例外クラスを利用する例
begin
例外が起こるかも知れない処理
rescue => e
puts e.message
例外が発生した時の処理
end
上記の例では、エラーによって生成された例外オブジェクトを「rescue => e」で受け取り、「e.message」に格納されたエラー内容を表示します。
rescueにエラータイプを指定できる
先ほどrescueで例外オブジェクトを受け取る使い方を説明しましたが、rescueにクラス名を指定することで、特定のエラーが発生した場合の処理を記述することが可能です。
また、beginとendの間にresureを複数記述できるので、例外クラスによって処理を変えられます。なお例外クラスを省略した場合は、通常のプログラムで発生する可能性の高い例外クラスのStandardErrorが適用されます。
rescueに例外クラスを指定する書き方
begin
例外が起こるかも知れない処理
rescue 例外クラス1 => e
例外クラス1の例外が発生した時の処理
rescue 例外クラス2 => e
例外クラス2の例外が発生した時の処理
end
また、Javaなどの他のプログラム言語のように、全ての例外クラスを意味するExceptionを指定することも可能です。
rescueにExceptionを指定する書き方
begin
例外が起こるかも知れない処理
rescue Exception => e
puts e.message
例外が発生した時の処理
end
強制的に例外を発生させる方法
例外処理のプログラムを組んだとしても、その例外が発生しないとプログラムをチェックできません。しかしRubyには意図的に例外を発生できるraiseメソッドがあるので、これで例外を発生させることでチェックできます。
次からraiseメソッドを使った強制的に例外を発生させる方法を紹介します。
raiseの使い方
raiseメソッドは引数で指定した例外を発生させるメソッドです。そしてraiseで発生させた例外は、rescueで捉えることが可能なため、resucueを含むプログラムのチェックに利用できます。
raiseの文法
raise( 発生させたい例外のクラス, 例外のメッセージ )
raiseの記述例
raise( StandardError, "raiseによる例外" )
これは通常のプログラムで発生する可能性の高い例外クラスStandardErrorの例外は発生させる例です。
raiseの例外をrescueで受ける方法
先ほど紹介したraiseをbigenとrescueの間に書くことで、raiseで発生させた例外をrescueで受けることが可能です。例えば、raiseでStandardErrorを発生させて、resucueでその例外を受けることで、resucueに続くプログラムをチェックできます。
raiseメソッドを使った例
begin raise StandardError, "raiseによる例外" rescue StandartError => e puts e.message end
例外が発生なかった場合の処理の書き方
先ほど紹介したように例外処理が発生した場合の処理をrescueの下に書きますが、Rubyの例外処理の構文はそれだけではありません。例外が発生しなかったときのプログラムと例外の有無にかかわらず実行されるプログラムも記述できます。
そして例外が発生しなかったときのプログラムをelseの次に、また例外の有無にかかわらず実行されるプログラムをensureの次に記述します。
例外構文の書き方
begin
例外が起こるかも知れない処理
rescue
例外が発生したときのプログラム
else
例外が発生しなかったときのプログラム
ensure
例外の有無にかかわらず最後に実行されるプログラム
end
このようにbegin~rescue~endの中にはelseやensureも使えるので、必要に応じて活用してください。
まとめ
これまで紹介したようにRubyの例外処理の構文はbegin~rescue~end構文です。そしてbeginとrescueの間に例外が発生する処理または強制的に例外を発生させるraiseメソッドを含む処理を、rescueとendの間に例外が発生した場合の処理を記述します。
Ruby on Railsで作成したWebシステムでは、たとえエラーが発生してシステムが止まったしても利用者に適切なメッセージを伝えなければなりません。それを実現するのが例外処理です。begin~rescue~end構文による例外処理を理解してWebシステムに活用してください。