web-dev-qa-db-ja.com

DRYファッションで複数のエラークラスをRubyのレスキュー句に渡す

Rubyで複数の種類の例外をレスキューする必要があるコードがあります。

begin
  a = Rand
  if a > 0.5
    raise FooException
  else
    raise BarException
  end
rescue FooException, BarException
  puts "rescued!"
end

私がやりたいのは、どこかでレスキューしたい例外タイプのリストを何らかの形で保存し、それらのタイプをレスキュー句に渡すことです:

EXCEPTIONS = [FooException, BarException]

その後:

rescue EXCEPTIONS

これは可能ですか?evalを実際にハックして呼び出さなくても可能ですか? TypeError: class or module required for rescue clause上記を試みたとき。

91
apb

私はこの問題にぶつかり、別の解決策を見つけました。 FooExceptionBarExceptionがすべてカスタム例外クラスになり、特にそれらがすべて主題的に関連している場合、同じ親からすべて継承するように継承階層を構築できます。クラスし、親クラスのみを救出します。

たとえば、3つの例外がありました:FileNamesMissingErrorInputFileMissingError、およびOutputDirectoryErrorは、1つのステートメントで救助したかったのです。 FileLoadErrorという別の例外クラスを作成し、上記の3つの例外を設定して、それを継承します。その後、FileLoadErrorのみを救出しました。

このような:

class FileLoadError < StandardError
end

class FileNamesMissingError < FileLoadError
end

class InputFileMissingError < FileLoadError
end

class OutputDirectoryError < FileLoadError
end

[FileNamesMissingError,
 InputFileMissingError,
 OutputDirectoryError].each do |error| 
   begin  
     raise error
   rescue FileLoadError => e
     puts "Rescuing #{e.class}."
   end 
end
1