chatty_errorというgemを作ってみた

こんにちは、河野です。

chatty_error というgemを作ってみました。

chatty_error

独自の例外クラスのエラーメッセージを、ロケールファイルから設定できるようになるライブラリです。
エラークラスをインスタンス化する時、エラーメッセージを設定するのが面倒だ!という問題を解決します。

chattyという単語に、

chatty: 【形】話し好きな、〔文章や話し方が〕くだけた

alc

という意味があるようなので、chatty_errorと名付けました。

作った背景

ある案件で、独自の例外クラスを作ったのですが、例外をraise するときに以下のようにしていました。

他のところでは、違うメッセージを

また別のところでは、

という感じで、同じエラーでもメッセージを変えることがありました。
理想を言えば細かく例外クラスを作った方が良さそうなのですが、とりあえずこんな感じで対応していたのです。

で、色んなところで、MyErrorをraiseする度に、I18nを呼び出さないといけません

これは何かモヤモヤする~ということで、chatty_error の登場です。

使い方

Gemのインストール

まずはgemを使えるようにします。bundlerの場合です。

bundleを実行します。

これで、ChattyErrorというモジュールが使用できるようになります。

原因を設定

さて、chatty_error では原因に対してメッセージを設定するという方針を採っています。なので、独自の例外クラスでは原因を設定する必要があります。caused_by を使用します。

MyErrorの例だと、以下のようになります。

「とんでもないことが起きた」「不正なアクセス」「間違った手順」という例外が起きる原因を定義しています。

メッセージを設定

次に、原因に対応するエラーメッセージを設定します。

例外の呼び出し方

raiseの時には、

という感じで、簡単に呼び出せます。

MyErrorのインスタンス化とともに、エラーメッセージも設定されます。ついでに、cause に原因に相当するシンボルが設定されます。

ロケールファイルの書き方

ロケールファイルに設定するキーは、「chatty_errors.クラス階層.原因」になります。

仮に以下のような定義になっていたら、

ロケールファイルは

となります。

デフォルト設定

ロケールファイル上のデフォルトスコープと、キーが一致しなかった場合のデフォルトメッセージを設定することができます。

デフォルトスコープを変更しているので、ロケールファイルは以下のようになります。

エラーメッセージの決定

エラーメッセージの決定は以下優先順位になります。

1. デフォルトスコープ、クラス階層、メソッド名から決定されるキーと対応するロケールファイル上のメッセージ
2. 'デフォルトスコープ.default_message' というキーと対応するロケールファイル上のメッセージ
3. configureで設定した、default_message に設定されているメッセージ

ちょっとした活用例

Railsの場合ですが、ApplicationControllerの中で rescue_fromを使用しています。

MyErrorのcauseによって、ログレベルを変えるという処理です。他にも色々と使いどころはあると思います。

リンク

rubygems | github

以上です。

Comments are closed, but you can leave a trackback: Trackback URL.