テストが通らなくて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
なわけ。
テストが通ったようなので、そろそろデプロイします……