1. ホーム
  2. ruby

[解決済み] Rubyで例外をキャッチした後に同じ例外を発生させる方法

2022-12-27 02:25:10

質問

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

どのように解決するのですか?

時々、私たちはただエラーを知りたくなります が発生した を、実際に を処理します。 を処理する必要はありません。

エラーを処理する責任があるのは、オブジェクトのユーザ、つまり呼び出し側であるということはよくあることです。もし私たちがエラーに興味があるが、その責任を負いたくないとしたらどうでしょうか?私たちはエラーを救助し、必要なことは何でも行い、そして何事もなかったかのようにスタック上にシグナルを伝播させます。

例えば、エラーメッセージを記録し、呼び出し元がそれに対処するようにしたい場合はどうでしょうか。

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

呼び方 raise を引数なしで呼び出すと、最後のエラーが発生します。私たちの場合、再レイズしているのは error .

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