web-dev-qa-db-ja.com

Rubyで例外をキャッチした後、Reraise(同じ例外)

例外をキャッチすることでRubyスキルを向上させようとしています。複数のメソッド呼び出しがある場合に同じ種類の例外をリレイズするのが一般的かどうかを知りたいので、次のコードは同じ種類の例外をリレイズしても大丈夫ですか、それともプロセスメソッドでキャッチすべきではありませんか?

class Logo
  def process
    begin
      @processed_logo = LogoProcessor::create_image(self.src)
    rescue CustomException
      raise CustomException
    end
  end
end

module LogoProcessor
  def self.create_image
    raise CustomException if some_condition
  end
end
57
Hommer Smith

エラーhappenedを知りたいだけで、実際にはhandle エラー。

多くの場合、エラーの処理を担当するのはオブジェクトのユーザー、つまり呼び出し元です。エラーに興味があるが、その責任を負いたくない場合はどうなりますか?エラーをレスキューし、必要なことを何でもして、何も起こらなかったようにシグナルをスタックに伝えます。

たとえば、エラーメッセージを記録し、呼び出し元に対処させたい場合はどうでしょうか。

begin
  this_will_fail!
rescue Failure => error
  log.error error.message
  raise
end

引数なしで raise を呼び出すと、最後のエラーが発生します。この例では、errorを再調達しています。

質問で示した例では、エラーを再度発生させる必要はありません。単純にスタックを自然に伝播させることができます。この例の唯一の違いは、最後のエラーオブジェクトを再生成するのではなく、新しいエラーオブジェクトを作成してそれを生成することです。

110
Matheus Moreira

これにより、元のエラーと同じタイプのエラーが発生しますが、メッセージをカスタマイズできます。

rescue StandardError => e
  raise e.class, "Message: #{e.message}"
1
FreePender