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
上記を試みたとき。
私はこの問題にぶつかり、別の解決策を見つけました。 FooException
とBarException
がすべてカスタム例外クラスになり、特にそれらがすべて主題的に関連している場合、同じ親からすべて継承するように継承階層を構築できます。クラスし、親クラスのみを救出します。
たとえば、3つの例外がありました:FileNamesMissingError
、InputFileMissingError
、および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