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

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 .


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

+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!"

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.


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
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.