Comment utiliser le sauvetage dans Ruby sans le bloc de début et de fin


Réponses:


223

Une méthode "def" peut servir d'instruction "begin":

def foo
  ...
rescue
  ...
end

3
En outre, les définitions de classe, les définitions de module et (je pense) do/ endles littéraux de bloc forment des blocs d'exceptions implicites.
Jörg W Mittag

pouvez-vous faire le sauvetage de la fin aussi?
Mohamed Hafez

Vous pouvez absolument faire en sorte que le sauvetage se termine également :-)
Antony

pouvez-vous utiliser plus d'un sauvetage dans votre def?
Marriedjane875

@ Marriedjane875 oui, vous pouvez utiliser plusieurs sauvetages, soit explicitement (chaque clause / bloc de sauvetage sur sa propre ligne) comme rescue TypeError; rescue NameError- ou vous pouvez séparer les classes d'exception par des rescue TypeError, NameError
virgules

48

Vous pouvez également sauver en ligne:

1 + "str" rescue "EXCEPTION!"

imprimera "EXCEPTION!" puisque 'String ne peut pas être forcé dans Fixnum'


1
Comment récupérez-vous et montrez-vous le backtrace d'exception en ligne?
Cyril Duchon-Doris

comment retourner l'exception réelle?
user1735921

1
Le sauvetage en ligne n'est pas une bonne pratique car il sauve StandardErroret toutes ses sous-classes, comme NameError- ce qui signifie que même une faute de frappe dans votre code ne soulèvera pas d'erreur. Voir thinkingbot.com/blog/don-t-inline-rescue-in- rubis .
BrunoFacca

26

J'utilise beaucoup la combinaison def / rescue avec les validations ActiveRecord:

def create
   @person = Person.new(params[:person])
   @person.save!
   redirect_to @person
rescue ActiveRecord::RecordInvalid
   render :action => :new
end

Je pense que c'est du code très léger!


19

Exemple:

begin
  # something which might raise an exception
rescue SomeExceptionClass => some_variable
  # code that deals with some exception
ensure
  # ensure that this code always runs
end

Ici, defen guise de begindéclaration:

def
  # something which might raise an exception
rescue SomeExceptionClass => some_variable
  # code that deals with some exception
ensure
  # ensure that this code always runs
end
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.