Que fait le mot clé fail dans Ruby?

88

J'apprends Ruby et j'ai rencontré le failmot - clé. Qu'est-ce que ça veut dire?

if password.length < 8
   fail "Password too short"
end
unless  username
   fail "No user name set"
end
Rêves
la source
8
En plus des réponses ci-dessous, il vaut la peine de savoir que les gens utilisent raisepour gérer les exceptions et failquand ce n'est pas le cas.
Bala
6
Ce n'est pas un mot-clé, c'est une méthode.
Jörg W Mittag
Documentation: Kernel # fail
Jared Beck
Notez également que vous pouvez les écrire sous forme d'instructions sur une seule ligne: fail "Password too short" if password.length < 8etfail "No user name set" unless username
PhilT

Réponses:

136

Dans Ruby, failest synonyme de raise. Le failmot-clé est une méthode du Kernelmodule qui est incluse par la classe Object. La failméthode génère une erreur d'exécution comme le raisemot clé.

La failméthode a trois surcharges:

  • fail: déclenche un RuntimeErrorsans message d'erreur.

  • fail(string): lève un RuntimeErroravec l'argument chaîne comme message d'erreur:

    fail "Failed to open file"
    
  • fail(exception [, string [, array]]): lève une exception de classe exception(premier argument) avec un message d'erreur optionnel (deuxième argument) et des informations de rappel (troisième argument).

    Exemple: Supposons que vous définissiez une fonction qui devrait échouer si un argument incorrect est donné. Il vaut mieux élever un ArgumentErroret non un RuntimeError:

    fail ArgumentError, "Illegal String"
    

    Un autre exemple: vous pouvez passer la totalité de la trace arrière à la failméthode afin de pouvoir accéder à la trace à l'intérieur du rescuebloc:

    fail ArgumentError, "Illegal String", caller
    

    callerest une méthode Kernel qui renvoie la trace arrière sous la forme d'un tableau de chaînes dans le formulaire file:line: in 'method'.

Sans argument, lève l'exception dans $! ou lève une RuntimeError si $! est nul. Avec un seul argument String, déclenche une RuntimeError avec la chaîne en tant que message. Sinon, le premier paramètre doit être le nom d'une classe Exception (ou un objet qui renvoie un objet Exception lors de l'envoi d'un message d'exception). Le deuxième paramètre facultatif définit le message associé à l'exception et le troisième paramètre est un tableau d'informations de rappel. Les exceptions sont interceptées par la clause de sauvetage des blocs begin ... end.

Source: Documentation Ruby sur le module du noyau .

crazybob
la source
2
Pouvez-vous donner 3 exemples simples avec les 3 puces? Cela rendra votre réponse plus concrète .. :)
Arup Rakshit
1
Wow, +1, crazybob est meilleur que Ruby docs ruby-doc.org/core-2.0.0/Kernel.html#method-i-raise :-)))
Boris Stitnicky
Cela a fonctionné pour moi mais Rubocop l'a converti enraise
Paul
32

Rubocop parle de l'utilisation des deux mots;

«Utilisez failau lieu de raisepour signaler les exceptions.»

'Utiliser raiseau lieu de failpour renvoyer les exceptions.'

Voici un exemple.

def sample
  fail 'something wrong' unless success?
rescue => e
  logger.error e
  raise
end
kuboon
la source
+1 pour les conseils de style; même s'ils sont identiques sur le plan sémantique, utiliser chacun dans leur cadre prévu permet de mieux transmettre l'intention
fatuhoku
26

fail == raise

En d'autres termes, failc'est juste un alias populaire pour raisela méthode de levée d' erreurs. Usage:

fail ArgumentError, "Don't argue with me!"
Boris Stitnicky
la source
7

www.ruby-doc.org est votre ami. Quand j'ai googlé rubydoc fail" Kernel " a été le premier succès. Mon conseil est, en cas de doute, d'aller à la source définitive pour des éléments de définition comme celui-ci.

pjs
la source
2
Woot, c'est vraiment un échec. Un exemple de code pour l'échec est le copier-coller de rise o_O
Vajk Hermecz
4
@VajkHermecz fail est un alias de raisonnement, donc il réutilise la documentation. Comparez avec les documents pour Array # map et Array # collect
Jamie Macey