Techioz Blog

Rubyで例外をキャッチした後に(同じ例外を)再発生させる

概要

例外をキャッチして Ruby のスキルを向上させようとしています。複数のメソッド呼び出しがある場合に、同じ種類の例外が再発生するのが一般的かどうかを知りたいです。それでは、次のコードは意味をなすでしょうか?同じ種類の例外を再発生させても問題ありませんか、それとも process メソッドでキャッチしない方がよいでしょうか?

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

解決策

実際にエラーを処理することなく、エラーが発生したことだけを知りたい場合があります。

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

たとえば、エラー メッセージをログに記録し、呼び出し元に対処してもらいたい場合はどうすればよいでしょうか。

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

引数を指定せずに raise を呼び出すと、最後のエラーが発生します。私たちの場合、エラーが再発生しています。

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