Ruby の独自エラークラスのデザイン
備忘録。
Ruby の例外クラスのインタフェース、とりわけコンストラクタと生成後に取得できるメッセージについて考えることがあったので、いくつかの事例をまとめる。
2.6.1 時点でのデフォルトの挙動
組み込みの Exception
クラスは to_s
がコンストラクタに与えた引数(を文字列化した結果)を返す。コンストラクタの引数が省略された場合はクラス名を返す。
message
は単に to_s
を呼び出す。
これを前提に、ユーザ Gem でのインタフェースの変更例を見てみる。
twitter (v6.2.0)
引数が2つ追加されているが、どちらもオプショナルなので組み込みの例外と同じ感覚でも作れる。第1引数で super
を呼び出すので、to_s
と message
の挙動は組み込みの例外とほぼ同じ。強いて言うなら、引数なしのデフォルト値が nil
ではなく空文字列。
octokit (v4.13.0)
コンストラクタは API からのレスポンスを表現する受け取り、それを元にメッセージを整形して super
を呼び出す。to_s
と message
はオーバーライドしていないので、コンストラクタ内で整形したメッセージを返すことになる。
twilio-ruby (v5.20.1)
こちらも API コールの例外を表現するために特化している。コンストラクタではメッセージ文字列に加えて、ライブラリ内で定義された型(Twilio::Response
)を受け取り、super
は呼び出さない(!)
to_s
はコンストラクタで受け取った情報を元に整形したメッセージを返すようにオーバーライドしている。message
はそのまま(なので to_s
と同じ)