例外をキャッチすることで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
エラーhappenedを知りたいだけで、実際にはhandle エラー。
多くの場合、エラーの処理を担当するのはオブジェクトのユーザー、つまり呼び出し元です。エラーに興味があるが、その責任を負いたくない場合はどうなりますか?エラーをレスキューし、必要なことを何でもして、何も起こらなかったようにシグナルをスタックに伝えます。
たとえば、エラーメッセージを記録し、呼び出し元に対処させたい場合はどうでしょうか。
begin
this_will_fail!
rescue Failure => error
log.error error.message
raise
end
引数なしで raise
を呼び出すと、最後のエラーが発生します。この例では、error
を再調達しています。
質問で示した例では、エラーを再度発生させる必要はありません。単純にスタックを自然に伝播させることができます。この例の唯一の違いは、最後のエラーオブジェクトを再生成するのではなく、新しいエラーオブジェクトを作成してそれを生成することです。
これにより、元のエラーと同じタイプのエラーが発生しますが、メッセージをカスタマイズできます。
rescue StandardError => e
raise e.class, "Message: #{e.message}"