Você pode usar uma matriz com o operador splat *.
EXCEPTIONS = [FooException, BarException]
begin
a = rand
if a > 0.5
raise FooException
else
raise BarException
end
rescue *EXCEPTIONS
puts "rescued!"
end
Se você for usar uma constante para a matriz como acima (com EXCEPTIONS), observe que você não pode defini-la dentro de uma definição, e também se você definir em alguma outra classe, você deve se referir a ela com seu namespace. Na verdade, não precisa ser uma constante.
Operador Splat
O operador splat *"desempacota" uma matriz em sua posição para que
rescue *EXCEPTIONS
significa o mesmo que
rescue FooException, BarException
Você também pode usá-lo em um literal de array como
[BazException, *EXCEPTIONS, BangExcepion]
que é o mesmo que
[BazException, FooException, BarException, BangExcepion]
ou em uma posição de argumento
method(BazException, *EXCEPTIONS, BangExcepion)
que significa
method(BazException, FooException, BarException, BangExcepion)
[] expande para vazio:
[a, *[], b] # => [a, b]
Uma diferença entre o rubi 1.8 e o rubi 1.9 é com nil.
[a, *nil, b] # => [a, b] (ruby 1.9)
[a, *nil, b] # => [a, nil, b] (ruby 1.8)
Tenha cuidado com os objetos em que to_aestá definido, como to_aserá aplicado em tais casos:
[a, *{k: :v}, b] # => [a, [:k, :v], b]
Com outros tipos de objetos, ele retorna a si mesmo.
[1, *2, 3] # => [1, 2, 3]