Was macht das Schlüsselwort fail in Ruby?

86

Ich lerne Ruby und bin auf das failSchlüsselwort gestoßen . Was heißt das?

if password.length < 8
   fail "Password too short"
end
unless  username
   fail "No user name set"
end
Träume
quelle
8
Zusätzlich zu den folgenden Antworten ist es wichtig zu wissen, dass Personen raisebeim Umgang mit Ausnahmen und failwenn nicht verwenden.
Bala
6
Es ist kein Schlüsselwort, es ist eine Methode.
Jörg W Mittag
Dokumentation: Kernel # fail
Jared Beck
Beachten Sie auch, dass Sie diese als einzeilige Anweisungen schreiben können: fail "Password too short" if password.length < 8undfail "No user name set" unless username
PhilT

Antworten:

135

In Ruby failist gleichbedeutend mit raise. Das failSchlüsselwort ist eine Methode des KernelModuls, die in der Klasse enthalten ist Object. Die failMethode löst genau wie das raiseSchlüsselwort einen Laufzeitfehler aus .

Die failMethode hat drei Überladungen:

  • fail: löst eine RuntimeErrorohne Fehlermeldung aus.

  • fail(string): löst ein RuntimeErrormit dem String-Argument als Fehlermeldung aus:

    fail "Failed to open file"
  • fail(exception [, string [, array]]): löst eine Ausnahme von Klasse exception(erstes Argument) mit einer optionalen Fehlermeldung (zweites Argument) und Rückrufinformationen (drittes Argument) aus.

    Beispiel: Angenommen, Sie definieren eine Funktion, die bei einem schlechten Argument fehlschlagen sollte. Es ist besser, ein ArgumentErrorund kein RuntimeError:

    fail ArgumentError, "Illegal String"

    Ein weiteres Beispiel: Sie können die gesamte Rückverfolgung an die failMethode übergeben, um auf die Ablaufverfolgung innerhalb des rescueBlocks zuzugreifen :

    fail ArgumentError, "Illegal String", caller

    callerist eine Kernel-Methode, die die Rückverfolgung als Array von Zeichenfolgen im Formular zurückgibt file:line: in 'method'.

Löst ohne Argumente die Ausnahme in $ aus! oder löst einen RuntimeError aus, wenn $! ist null. Löst mit einem einzelnen String-Argument einen RuntimeError mit dem String als Nachricht aus. Andernfalls sollte der erste Parameter der Name einer Ausnahmeklasse sein (oder eines Objekts, das beim Senden einer Ausnahmemeldung ein Ausnahmeobjekt zurückgibt). Der optionale zweite Parameter legt die der Ausnahme zugeordnete Nachricht fest, und der dritte Parameter ist ein Array von Rückrufinformationen. Ausnahmen werden durch die Rettungsklausel von Anfangs- und Endblöcken erfasst.

Quelle: Ruby-Dokumentation auf dem Kernelmodul .

verrückter Bob
quelle
2
Können Sie 3 einfache Beispiele mit den 3 Aufzählungspunkten geben? Es wird Ihre Antwort konkreter machen .. :)
Arup Rakshit
1
Wow, +1, crazybob ist besser als Ruby docs ruby-doc.org/core-2.0.0/Kernel.html#method-i-raise :-)))
Boris Stitnicky
Es hat bei mir funktioniert, aber Rubocop hat es inraise
paul
31

Rubocop sagt über die Verwendung beider Wörter;

"Verwenden Sie failstatt raise, um Ausnahmen zu signalisieren."

"Verwenden Sie raisestatt failAusnahmen erneut zu werfen."

Hier ist ein Beispiel.

def sample
  fail 'something wrong' unless success?
rescue => e
  logger.error e
  raise
end
Kuboon
quelle
+1 für Stilberatung; Selbst wenn sie semantisch identisch sind, hilft die Verwendung jeder in ihrer beabsichtigten Einstellung, die Absicht besser zu vermitteln
Fatuhoku
26

fail == raise

Mit anderen Worten, failist nur ein beliebter Alias ​​für raisedie Methode zur Fehlerbehebung. Verwendung:

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

www.ruby-doc.org ist dein Freund. Als ich gegoogelt habe, war rubydoc fail" Kernel " der erste Treffer. Mein Rat ist, im Zweifelsfall zur endgültigen Quelle für solche Definitionssachen zu gehen.

pjs
quelle
2
Woot, das ist wirklich ein Fehler. Codebeispiel für Fehler ist Kopieren-Einfügen von Raise o_O
Vajk Hermecz
4
@VajkHermecz fail ist ein Alias ​​für das Erhöhen, daher wird die Dokumentation wiederverwendet. Vergleichen Sie mit den Dokumenten für Array # map und Array # collect
Jamie Macey