【Ruby】エラー、例外処理

ABOUTこの記事をかいた人

気になること&知らないことをひたすらググることを得意としています。このブログでは最近気になったことを中心に記事を書いていきます。記事には間違った情報を書かないように細心の注意を払っていますが、もし誤りがあった場合はコメントやお問い合わせフォームからご指摘いただければ幸いです。

Rubyにてエラーが起こった場合はエラーの種類や発生場所を教えてくれますので非常に便利です。今回は取り敢えずエラーを発生させてみます。

C:/Users/error.rb:1:in <main>': undefined local variable or method hoge' for main:Object (NameError)

ただ単に「hoge」と記述しているだけなのでNameErrorが発生して、そんなメソッドや変数はありませんよ~といった感じで警告のようなものが出ます。

今回はこのようなエラーが出た場合に対処できる例外処理についてみていきましょう。

基本となる例外処理の書き方

Rubyで基本となる例外処理の書き方は↓の通りとなります。

それでは初めにわざとエラーを起こした「hoge」をこの例外処理の中に入れてみましょう。

エラーが起こりました

これで2行目でエラーが発生したものの処理は中断されず、4行目の「”エラーが起こりました”」という文字列の表示ができました。

エラーが起こった場合は例外オブジェクトを変数に格納できる?

まず、前提としてRubyはオブジェクト指向で一貫しているので例外にもオブジェクトが存在します。それでは例外を発生させて例外オブジェクトを変数に代入する方法をみていきましょう。記述方法は↓のようになります。

このような記述を行うことで例外オブジェクトを任意の変数に代入することができるようになります。実際に例外オブジェクトを変数に入れてみることにします。

エラーが起こりました
#<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のあとに書いていきます。

エラーが起こりました
絶対実行

これで例外の有無に関わらず文字列「”絶対実行”」を表示することができます。

rescue修飾子

rescueは修飾子のように使うこともできます。普通に記述すると5行は書かないといけない処理がrescue修飾子を使うと1行でスッキリ書くことができます。

メソッド全体をエラー処理に使う場合

メソッドを定義してそのメソッドを全てエラー処理につかう場合は、初めの「begin」と最後の「end」は省略することができます。

エラー発生

ちなみに省略しない場合は下記のように無駄な行が追加されてしまいますので上記の方がスッキリとした見た目になります。

補足する例外の指定

rescueの後ろに例外クラスを指定するとそのクラスのエラーを補足してくれます。

C:/Users/error.rb:1:in <main>': undefined local variable or method name' for main:Object (NameError)

今回は補足するエラーを「ZeroDivisionError」としましたので「NameError」は普通にスルーされて警告が表示されます。補足したい例外が複数ある場合にもrescue節を増やしていけばOKです。

また、「rescue 例外クラス => 代入したい変数」と書くことで補足したい例外を指定しつつ、例外が発生した場合には任意の変数に代入することができます。

NameError!!!
NameError

raiseメソッド

raiseメソッドは例外を意図的に発生されることができるメソッドです。raiseで発生させたエラーのクラスは「RuntimeError」となります。

RuntimeError

エラーの種類を指定

raiseメソッドに例外クラスを渡すとそのクラスでのエラーとして発生させることができます。

ZeroDivisionError!!!
ZeroDivisionError

エラーメッセージの設定

raiseメソッドに文字列を渡すとこの文字列をエラーメッセージとして表示させることができるようになります。

RuntimeError
"error!!!"

エラーの種類とメッセージの両方を設定

エラーの種類とメッセージの両方を設定する方法は下記のように「raise クラス名, メッセージ」と2つ引数を渡してあげればOKです。

#<ZeroDivisionError: ---error--->
ZeroDivisionError
"---error---"

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

ABOUTこの記事をかいた人

気になること&知らないことをひたすらググることを得意としています。このブログでは最近気になったことを中心に記事を書いていきます。記事には間違った情報を書かないように細心の注意を払っていますが、もし誤りがあった場合はコメントやお問い合わせフォームからご指摘いただければ幸いです。