テストが通らなくて5時間泣いた話をしようか

class MyError < StandardError
  attr_reader :exception
  def initialize(exn)
    @exception = exn
  end
end

begin
  begin
    1/0
  rescue ZeroDivisionError => exn
    raise MyError.new(exn)
  end
rescue MyError => exn
  p "rescue MyError", exn
rescue Exception => exn
  p "rescue Exception", exn
end

上みたいなコードでMyErrorみたいな例外を定義します。なぜかと言うと、モデル層で発生しうるZeroDivisionErrorをアプリケーション層まで持ち越したくないから。とはいえ、元の例外を握りつぶすのもどうかと思うので、exceptionみたいなフィールドを作って、そこに格納することにしましょう。そこまで頭悪い感じの設計でもないと思います(とはいえ僕が一人で思ってるだけなので、わかりませんが)。

で、これを実行するとなんて出るかって言うのが今日の問題です。


んなもんrescue MyErrorに決まってるじゃん!と思うでしょ?思うでしょ??思うでしょ???


http://doc.ruby-lang.org/ja/1.9.3/class/Exception.html

Exception#exceptionは例外を発生させるメソッドで、raiseしたときにはこのメソッドが呼ばれ、得られた例外のオブジェクトが投げられます。なので、MyErrror#exceptionが元のZeroDivisionErrorになるので、rescueした結果を見るとZeroDivisionErrorなわけ。


テストが通ったようなので、そろそろデプロイします……