DRY方式で複数のエラークラスをrubyのrescue句に渡す



Passing Multiple Error Classes Rubys Rescue Clause Dry Fashion



解決:

スプラット演算子で配列を使用できます*。

EXCEPTIONS = [FooException、BarException]開始a = rand if> 0.5レイズFooExceptionそれ以外の場合レイズBarExceptionエンドレスキュー* EXCEPTIONS puts'rescued! '終わり

上記のように配列に定数を使用する場合(例外)、定義内で定義することはできません。また、他のクラスで定義する場合は、名前空間で参照する必要があることに注意してください。実際には、定数である必要はありません。




スプラットオペレーター

スプラット演算子* '配列をその位置でアンパック'して、

レスキュー*例外

と同じ意味



レスキューFooException、BarException

配列リテラル内で次のように使用することもできます

[BazException、* EXCEPTIONS、BangExcepion]

これはと同じです

[BazException、FooException、BarException、BangExcepion]

または引数の位置に



メソッド(BazException、* EXCEPTIONS、BangExcepion)

つまり、

メソッド(BazException、FooException、BarException、BangExcepion)

[]は空虚に拡大します:

[a、* []、b]#=> [a、b]

ルビー1.8とルビー1.9の違いの1つはなし。

[a、* nil、b]#=> [a、b](ruby 1.9)[a、* nil、b]#=> [a、nil、b](ruby 1.8)

対象物に注意してくださいto_aは、次のように定義されます。to_aは、次のような場合に適用されます。

[a、* {k :: v}、b]#=> [a、[:k、:v]、b]

他のタイプのオブジェクトでは、それ自体を返します。

[1、* 2、3]#=> [1、2、3] 

@sawaの答えは技術的には正しいですが、Rubyの例外処理メカニズムを誤用していると思います。

Peter Ehrlichによるコメントが示唆しているように(Mike Ferrierによる古いブログ投稿を指して)、RubyにはすでにDRY例外ハンドラメカニズムが装備されています。

puts'starting up 'begin case rand(3)when 0([] +' ')when 1(foo)when 2(3/0)endrescue TypeError、NameError => e puts'oops:#{e.message} 'レスキュー例外=> e puts' ouch、#{e} 'end puts' done '

この手法を使用することで、通常はいくつかの貴重な情報が含まれている例外オブジェクトにアクセスできます。