Ruby 例外処理の書き方
Rubyの例外処理の書き方は以下のようにbegin ~ rescue ~ end文を活用します。
begin 例外を発生させる可能性のある処理 rescue 例外が起こった場合の処理 end
例外クラスを指定する場合はこんな感じ
begin 1/0 rescue ZeroDivisionError puts"0で除算しました" end
例外情報をオブジェクトとして扱う方法
begin 例外を発生させる可能性のある処理 rescue => 例外オブジェクトが代入される変数 例外が起こった場合の処理 end
常に実行したい処理がある場合はensureを使う
begin 例外を発生させる可能性のある処理 rescue => 変数 例外が起こった場合の処理 ensure 例外の有無にかかわらずに実行される処理 end
例外時に何かやり直したいときはretryを利用する
begin #例外が発生するかもしれない処理 rescue retry#処理をやりなおす end
明示的に例外エラーを発生させる方法
例外エラーを発生させたい箇所にraiseを記載する。
raise
第1引数に例外を、第2引数にエラーメッセージを渡すことも可能です。
raiseArgumentError,"あーぎゅめんとえらーです"
もう一歩踏み込んで、例外オブジェクトから情報を取得する。
begin 1/0 rescue=>e puts"エラークラス:#{e.class}" puts"エラーメッセージ:#{e.message}" puts"バックトレース--------" puts e.backtrace puts"--------" end
e.class -> エラークラス取得 e.message -> エラーメッセージ取得 e.backtrace -> エラーまでのトレース情報を取得
エラークラス:ZeroDivisionError エラーメッセージ:divided by 0 バックトレース(irb):2:in`/' (irb):2:in`irb_binding' 省略/(Rubyがインストールされているパス)/irb:11:in`<main>' --------
例外クラスの継承関係
参考画像:伊藤 淳一. プロを目指す人のためのRuby入門 言語仕様からテスト駆動開発・デバッグ技法まで
standarderrorは通常のプログラムで発生する可能性の高い例外を表すクラス rescueで特に指定しなかった場合はstandarderrorとstandarderrorのサブクラスしかrescue出来ない。