Rubyでカスタム例外を作成する方法【初心者向けガイド】
Rubyでは、独自の例外クラスを簡単に作成できます。この記事では、カスタム例外を作るための基本的な手順を、コード例とともにわかりやすく解説します。
1. 新しいクラスを作成する
Rubyにおいて、例外も他のオブジェクトと同じくクラスとして定義されています。新しい種類の例外を作りたい場合は、StandardError、あるいはそのサブクラスを継承したクラスを定義するだけでOKです。
class MyError < StandardError
end
raise MyError
慣例として、新しく作る例外クラスの名前は「Error」で終わるように命名します。また、カスタム例外をモジュールの中にまとめておくのも良いプラクティスです。そうすることで、最終的には ActiveRecord::RecordNotFound や Net::HTTP::ConnectionError のような、整理された名前空間を持つエラークラスになります。
2. メッセージを追加する
すべてのRuby例外オブジェクトには、message 属性が備わっています。これは、例外名の隣に表示される説明テキストのことです。
例外のmessage属性の表示例
例外を発生させる際に、次のようにメッセージを指定できます。
raise MyError, "My message"
さらに、独自のコンストラクタを定義すれば、カスタムエラークラスにデフォルトメッセージを持たせることも可能です。
class MyError < StandardError
def initialize(msg="My default message")
super
end
end
3. 例外にカスタムデータ属性を追加する
通常のクラスと同じ要領で、例外オブジェクトにも自由にカスタムデータを持たせられます。ここでは、属性リーダー(attr_reader)をクラスに追加し、コンストラクタを拡張してみましょう。
class MyError < StandardError
attr_reader :thing
def initialize(msg="My default message", thing="apple")
@thing = thing
super(msg)
end
end
begin
raise MyError.new("my message", "my thing")
rescue => e
puts e.thing # "my thing"
end
以上で完成です!Rubyでカスタムエラーや例外を作成するのは、思ったよりも簡単だと感じていただけたのではないでしょうか。
ただし、一つだけ重要な注意点があります。これまでの例では、必ず StandardError を継承していましたよね?これは意図的なものです。Rubyには Exception クラスも存在しますが、そこから直接継承してはいけません。Exception を直接継承した例外は、rescue のデフォルトの捕捉対象外となるため、予期しない動作を引き起こす可能性があります。詳しくは、「ExceptionとStandardErrorの違い」についての記事も併せてご覧ください。
-
Rubyで例外にコンテキストデータを追加する3つの方法
標準のバックトレースやエラーメッセージだけでは、エラーの原因を特定するのに十分な情報が得られないことがあります。そんなときに役立つのが、例外への追加データの付与です。幸い、Rubyではこれをとても簡単に実現できます。 エラーメッセージをカスタマイズする 例外にコンテキスト情報を加える最もシンプルな方法は、メッセージそのものに情報を組み込んでしまうことです。次の例では、発生した例外を捕捉し、新しいメッセージを付けて再送出しています。 begin raise foo rescue => e raise e.class, bar end # RuntimeError: bar
-
【Ruby】デコレータデザインパターンでクラスを変更せずにオブジェクトを拡張する方法
デコレータ(Decorator)デザインパターンとは、どのようなものなのでしょうか? また、このパターンをRubyのプロジェクトではどのように活用すればよいのでしょうか? デコレータデザインパターンを利用すると、クラスそのものを変更することなく、オブジェクトに新しい機能を追加して拡張することができます。 それでは、具体的な例を見ていきましょう! ログ出力とパフォーマンス計測の実装例 この例では、rest-clientのようなGemを使ってHTTPリクエストを送信します。 コードは次のようになります。 require restclient data = RestClient.get(www.