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

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 .


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

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

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.


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.