113 votes

En passant plusieurs classes error à ruby ' clause de sauvetage de s de manière sèche

J'ai un code qui doit le sauvetage de plusieurs types d'exceptions en ruby:

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

Ce que je voudrais faire est un moyen de stocker la liste des types d'exception que j'ai envie de sauver quelque part et de transmettre ces types à la rescousse de la clause:

EXCEPTIONS = [FooException, BarException]

et puis:

rescue EXCEPTIONS

Est-ce même possible, et est-il possible sans vraiment hack-y les appels d' eval? Je ne suis pas d'espoir étant donné que je suis de voir TypeError: class or module required for rescue clause lorsque je tente de la ci-dessus.

218voto

sawa Points 62592

Vous pouvez utiliser un tableau avec le dossier de l'opérateur *.

EXCEPTIONS = [FooException, BarException]

begin
  a = rand
  if a > 0.5
    raise FooException
  else
    raise BarException
  end
rescue *EXCEPTIONS
  puts "rescued!"
end

Si vous allez utiliser une constante pour le tableau comme ci-dessus (avec EXCEPTIONS), notez que vous ne pouvez pas définir à l'intérieur d'une définition, et aussi si vous définissez dans certains autres de la classe, vous devez vous référer à elle avec son espace de noms. En fait, il n'a pas à être une constante.


Splat Opérateur

Le splat opearator * "déballe" un tableau dans sa position de sorte que

rescue *EXCEPTIONS

signifie la même chose que

rescue FooException, BarException

Vous pouvez également l'utiliser à l'intérieur d'un littéral de tableau comme

[BazException, *EXCEPTIONS, BangExcepion]

qui est le même que

[BazException, FooException, BarException, BangExcepion]

ou dans un argument de position

method(BazException, *EXCEPTIONS, BangExcepion)

ce qui signifie

method(BazException, FooException, BarException, BangExcepion)

[] étend à vide:

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

Une différence entre ruby et ruby 1.8 1.9 est avec nil.

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

Être prudent avec les objets sur lesquels to_a est défini, en to_a sera appliquée dans de tels cas:

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

Avec d'autres types d'objets, il renvoie lui-même.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X