Ruby の独自エラークラスのデザイン

備忘録。

Ruby の例外クラスのインタフェース、とりわけコンストラクタと生成後に取得できるメッセージについて考えることがあったので、いくつかの事例をまとめる。

2.6.1 時点でのデフォルトの挙動

組み込みの Exception クラスは to_s がコンストラクタに与えた引数(を文字列化した結果)を返す。コンストラクタの引数が省略された場合はクラス名を返す。

message は単に to_s を呼び出す。

これを前提に、ユーザ Gem でのインタフェースの変更例を見てみる。

twitter (v6.2.0)

引数が2つ追加されているが、どちらもオプショナルなので組み込みの例外と同じ感覚でも作れる。第1引数で super を呼び出すので、to_smessage の挙動は組み込みの例外とほぼ同じ。強いて言うなら、引数なしのデフォルト値が nil ではなく空文字列。

octokit (v4.13.0)

コンストラクタは API からのレスポンスを表現する受け取り、それを元にメッセージを整形して super を呼び出す。to_smessage はオーバーライドしていないので、コンストラクタ内で整形したメッセージを返すことになる。

twilio-ruby (v5.20.1)

こちらも API コールの例外を表現するために特化している。コンストラクタではメッセージ文字列に加えて、ライブラリ内で定義された型(Twilio::Response)を受け取り、super は呼び出さない(!)

to_s はコンストラクタで受け取った情報を元に整形したメッセージを返すようにオーバーライドしている。message はそのまま(なので to_s と同じ)