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 を呼び出すと、最後のエラーが発生します。私たちの場合、エラーが再発生しています。
質問で示した例では、エラーを再発生させる必要はありません。単純にスタック上に自然に伝播させることもできます。あなたの例の唯一の違いは、最後のエラー オブジェクトを再生成するのではなく、新しいエラー オブジェクトを作成してそれを生成していることです。