EffectiveRubyを読み進めててStandardErrorの継承が便利だと思った

Posted by jolantern on Friday, June 23, 2017

TOC

EffectiveRubyをたまに読んでいる

Rubyをよく書いているので、読む価値があろうと前にセールしてた時に買って以来ちびちび読んでいる。 読んだ上で理解できないところがたまにあるのでまだまだ自分の理解が足りてないところがあるのだなあと感じたけど、そういうことを顧みれるのもこの手の本を読む良いところだなあと思う。

たまに使ってるやつ

この本を読んでいて、感動して使ってるのが例外処理をする時にStandardErrorを継承したクラスを作って、それをraiseにエラーの内容を示す文字列とともに渡すというもの。 具体的には

<code class="ruby">class HogeClassError <StandardError ; end
</code>

としておくと、どこのエラーなのかがわかりやすくなる。 例えば、DBのアクセサを書いていたとしたら

<code class="ruby">class DatabaseAccesserError <StandardError ; end

require 'sequel'

begin
  @db = Sequel.connect(ENV["DATABASE_URL"])
rescue => exception
  raise(DatabaseAccesserError.new("データベースに接続できません"))
end

</code>

とhoge.rbに書いて実行すると

<code class="ruby">`rescue in <main>': データベースに接続できません (DatabaseAccesserError)
    from hoge.rb:5:in `<main>'
</code>

と言うようなことが出来る。exceptionをもっと上手く使おうぜという話もあるのだけど、例外を作ってあげるとどこのエラーなのかわかりやすくなる。 もしこれを使わずに普通にraiseだけすると `connect': Sequel::Database.connect takes either a Hash or a String, given: nil (Sequel::Error) というようなことを言われる。例に使ったSequelの例外がわかりやすくて例として微妙だけど、自分で色々作っていっているとこうやって例外を作ったほうが良い場面に出会いそうなので覚えておこう、と思ったのであった。 少なくとも、raiseと書くのとraise(“なんかこうなったらエラーになったりするよ”)と書くのとでは雲泥の差がありそうで、乱暴にraiseせずにするならこういう情報を、エラーを見た人に与えるべきなのだなあ。