Rubyの例外Tips

みんな最初は迷う例外のTips。

Effective Ruby

Effective Ruby

項目22 raiseにはただの文字列ではなくカスタム例外を渡そう

raiseに文字列を渡すとRuntimeErrorとなる

>> raise("coffee machine low on water")
RuntimeError (coffee machine low on water)

カスタムエラークラスの名称

これは大抵どんな本でも記載があるのでみんな知っていると思うが、
rubyのExceptionは低水準エラーを含むので、通常の例外はStandardErrorを継承するのが一般的。
名称も〜Errorにしておこうという話。
名前は〜Exceptionとしてしまっていたこともあるので、今後はErrorを使うようにしよう。
 

カスタム例外クラスの構成

メッセージ以外に補助情報を持たせたいときカスタム例外を使うと便利。
本書では3Dプリンタを操作するユーティリティを例にし、温度を格納するようにしている。

class TemperatureError < StandardError
    attr_reader :temperature

    def initialize(temperature)
      @temperature = temperature
      super("invalid temperature: #{@temperature}")
    end
end

raise(TemperatureError.new(180))
TemperatureError (invalid temperature: 180)

1プロジェクトに複数あるなら独自のクラス階層にまとめることを検討すべき。

覚えておくべき事項

  • 例外としてraiseに文字列を渡すのは避けよう。この場合汎用のRuntimeErrorオブジェクトが使われる。そうではなく、カスタム例外クラスを作ろう。
  • カスtクァむ例外クラスはStandardErrorを継承し、クラス名がErrorで終わるようにしよう。
  • 一つのプロジェクトのために複数の例外クラスを作るときには、まずStandardErrorを継承する基底クラスを作り、ほかの例外クラスはそのカスタム基底クラスを継承するように構成しよう。
  • カスタム来街クラスのためにinitializeメソッドを書くときには、superを呼び出すようにしよう。super呼び出しにエラーメッセージを渡せばなおよい。
  • initializeでエラーメッセージを設定するときには、raiseでエラーメッセージを設定すると、initializeのメッセージが上書きされてしまうことに注意しよう。