Rubyにてエラーが起こった場合はエラーの種類や発生場所を教えてくれますので非常に便利です。今回は取り敢えずエラーを発生させてみます。
1 |
hoge |
C:/Users/error.rb:1:in <main>': undefined local variable or method hoge' for main:Object (NameError)
ただ単に「hoge」と記述しているだけなのでNameErrorが発生して、そんなメソッドや変数はありませんよ~といった感じで警告のようなものが出ます。
今回はこのようなエラーが出た場合に対処できる例外処理についてみていきましょう。
Contents
基本となる例外処理の書き方
Rubyで基本となる例外処理の書き方は↓の通りとなります。
1 2 3 4 5 |
begin エラーが発生しうる記述 rescue エラーとなった場合の処理 end |
それでは初めにわざとエラーを起こした「hoge」をこの例外処理の中に入れてみましょう。
1 2 3 4 5 |
begin hoge rescue puts "エラーが起こりました" end |
エラーが起こりました
これで2行目でエラーが発生したものの処理は中断されず、4行目の「”エラーが起こりました”」という文字列の表示ができました。
エラーが起こった場合は例外オブジェクトを変数に格納できる?
まず、前提としてRubyはオブジェクト指向で一貫しているので例外にもオブジェクトが存在します。それでは例外を発生させて例外オブジェクトを変数に代入する方法をみていきましょう。記述方法は↓のようになります。
1 2 3 4 5 |
begin エラーが発生しうる記述 rescue => 「ここに代入したい変数を記入」 エラーとなった場合の処理 end |
このような記述を行うことで例外オブジェクトを任意の変数に代入することができるようになります。実際に例外オブジェクトを変数に入れてみることにします。
1 2 3 4 5 6 7 8 9 10 |
begin hoge rescue => foo puts "エラーが起こりました" end p foo p foo.class # 例外の種類(クラス) p foo.message # メッセージ p foo.backtrace # 例外となったファイル、行 |
エラーが起こりました #<NameError: undefined local variable or method hoge' for main:Object> NameError "undefined local variable or method hoge' for main:Object" ["C:/Users/error.rb:2:in <main>'"]
これで例外オブジェクトを変数「foo」に代入することができました。また、上記8~10行目のように例外オブジェクトのメソッドを使うと例外の詳細をみることができます。
ensure節について
エラーが発生しても、しなくても行いたい処理がある場合はensureのあとに書いていきます。
1 2 3 4 5 6 7 |
begin hoge rescue => foo puts "エラーが起こりました" ensure puts "絶対実行" end |
エラーが起こりました 絶対実行
これで例外の有無に関わらず文字列「”絶対実行”」を表示することができます。
rescue修飾子
rescueは修飾子のように使うこともできます。普通に記述すると5行は書かないといけない処理がrescue修飾子を使うと1行でスッキリ書くことができます。
1 2 3 4 5 6 7 |
begin hoge rescue "error!!!" end hoge rescue "error!!!" |
メソッド全体をエラー処理に使う場合
メソッドを定義してそのメソッドを全てエラー処理につかう場合は、初めの「begin」と最後の「end」は省略することができます。
1 2 3 4 5 6 7 |
def my_error hoge rescue "エラー発生" end puts my_error |
エラー発生
ちなみに省略しない場合は下記のように無駄な行が追加されてしまいますので上記の方がスッキリとした見た目になります。
1 2 3 4 5 6 7 |
def my_error begin hoge rescue "エラー発生" end end |
補足する例外の指定
rescueの後ろに例外クラスを指定するとそのクラスのエラーを補足してくれます。
1 2 3 4 5 |
begin name rescue ZeroDivisionError puts "ZeroDivisionError!!!" end |
C:/Users/error.rb:1:in <main>': undefined local variable or method name' for main:Object (NameError)
今回は補足するエラーを「ZeroDivisionError」としましたので「NameError」は普通にスルーされて警告が表示されます。補足したい例外が複数ある場合にもrescue節を増やしていけばOKです。
また、「rescue 例外クラス => 代入したい変数」と書くことで補足したい例外を指定しつつ、例外が発生した場合には任意の変数に代入することができます。
1 2 3 4 5 6 7 8 |
begin name rescue NameError => foo puts "NameError!!!" rescue ZeroDivisionError => foo puts "ZeroDivisionError!!!" end p foo.class |
NameError!!! NameError
raiseメソッド
raiseメソッドは例外を意図的に発生されることができるメソッドです。raiseで発生させたエラーのクラスは「RuntimeError」となります。
1 2 3 4 5 6 7 8 9 10 |
begin raise rescue NameError puts "NameError!!!" rescue ZeroDivisionError puts "ZeroDivisionError!!!" rescue => foo end p foo.class |
RuntimeError
エラーの種類を指定
raiseメソッドに例外クラスを渡すとそのクラスでのエラーとして発生させることができます。
1 2 3 4 5 6 7 8 9 10 |
begin raise ZeroDivisionError rescue NameError => foo puts "NameError!!!" rescue ZeroDivisionError => foo puts "ZeroDivisionError!!!" rescue => foo end p foo.class |
ZeroDivisionError!!! ZeroDivisionError
エラーメッセージの設定
raiseメソッドに文字列を渡すとこの文字列をエラーメッセージとして表示させることができるようになります。
1 2 3 4 5 6 7 |
begin raise "error!!!" rescue => foo end p foo.class p foo.message |
RuntimeError "error!!!"
エラーの種類とメッセージの両方を設定
エラーの種類とメッセージの両方を設定する方法は下記のように「raise クラス名, メッセージ」と2つ引数を渡してあげればOKです。
1 2 3 4 5 6 7 8 |
begin raise ZeroDivisionError, "---error---" rescue => foo end p foo p foo.class p foo.message |
#<ZeroDivisionError: ---error---> ZeroDivisionError "---error---"
コメントを残す