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

115

Je connais la technique standard pour commencer le sauvetage

Comment utiliser le bloc de sauvetage seul.

Comment ça marche et comment sait-il quel code est surveillé?

Sid
la source

Réponses:

223

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

def foo
  ...
rescue
  ...
end
alex.zherdev
la source
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'

peku
la source
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!

Edwin V.
la source
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
Hieu Le
la source