Co robi słowo kluczowe fail w języku Ruby?

88

Uczę się języka Ruby i napotkałem failsłowo kluczowe. Co to znaczy?

if password.length < 8
   fail "Password too short"
end
unless  username
   fail "No user name set"
end
Sny
źródło
8
Oprócz poniższych odpowiedzi warto wiedzieć, że ludzie używają raisepodczas obsługi wyjątków, a failkiedy nie.
Bala,
6
To nie jest słowo kluczowe, to metoda.
Jörg W Mittag,
Dokumentacja: Kernel # fail
Jared Beck
Zauważ również, że możesz je zapisać jako instrukcje fail "Password too short" if password.length < 8fail "No user name set" unless username
jednowierszowe

Odpowiedzi:

136

W Rubim failjest synonimem raise. Słowo failkluczowe to metoda Kernelmodułu zawartego w klasie Object. failMetoda budzi błąd wykonania podobnie jak raisehasła.

failMetoda ma trzy przeciążeń:

  • fail: wywołuje RuntimeErrorbez komunikatu o błędzie.

  • fail(string): podnosi a RuntimeErrorz argumentem łańcuchowym jako komunikatem o błędzie:

    fail "Failed to open file"
    
  • fail(exception [, string [, array]]): zgłasza wyjątek klasy exception(pierwszy argument) z opcjonalnym komunikatem o błędzie (drugi argument) i informacją zwrotną (trzeci argument).

    Przykład: Załóżmy, że definiujesz funkcję, która powinna zakończyć się niepowodzeniem, jeśli podano zły argument. Lepiej jest podnieść ArgumentErrora nie RuntimeError:

    fail ArgumentError, "Illegal String"
    

    Inny przykład: Możesz przekazać cały ślad do failmetody, aby uzyskać dostęp do śladu wewnątrz rescuebloku:

    fail ArgumentError, "Illegal String", caller
    

    callerjest metodą jądra, która zwraca ślad w postaci tablicy ciągów w postaci file:line: in 'method'.

Bez argumentów zgłasza wyjątek w $! lub podnosi RuntimeError, jeśli $! jest zero. Z pojedynczym argumentem String wywołuje RuntimeError z łańcuchem jako komunikatem. W przeciwnym razie pierwszym parametrem powinna być nazwa klasy Exception (lub obiektu, który zwraca obiekt Exception po wysłaniu komunikatu o wyjątku). Opcjonalny drugi parametr ustawia komunikat skojarzony z wyjątkiem, a trzeci parametr jest tablicą informacji zwrotnych. Wyjątki są objęte klauzulą ​​ratunkową bloków begin ... end.

Źródło: Dokumentacja Ruby dotycząca modułu jądra .

crazybob
źródło
2
Czy możesz podać 3 proste przykłady z trzema punktorami? Dzięki temu twoja odpowiedź będzie bardziej konkretna .. :)
Arup Rakshit
1
Wow, +1, crazybob jest lepszy niż Ruby docs ruby-doc.org/core-2.0.0/Kernel.html#method-i-raise :-)))
Boris Stitnicky
U mnie zadziałało, ale Rubocop przekonwertował to naraise
paul
32

Rubocop mówi o użyciu obu słów;

„Użyj failzamiast raisedo sygnalizowania wyjątków”.

„Użyj raisezamiast, failaby ponownie zgłosić wyjątki”.

Oto przykład.

def sample
  fail 'something wrong' unless success?
rescue => e
  logger.error e
  raise
end
kuboon
źródło
+1 za porady dotyczące stylu; nawet jeśli są one identyczne w każdym semantycznie używając ich zamierzonego ustawienia pomaga przekazać intencję lepiej
fatuhoku
26

fail == raise

Innymi słowy, failjest po prostu popularnym aliasem do raisemetody zgłaszania błędów. Stosowanie:

fail ArgumentError, "Don't argue with me!"
Boris Stitnicky
źródło
7

www.ruby-doc.org to twój przyjaciel. Kiedy wyszukałem w Google rubydoc failKernel ”, był to pierwszy hit. Radzę, jeśli masz wątpliwości, udaj się do ostatecznego źródła takich definicji.

pjs
źródło
2
Woot, to naprawdę jest NIEPOWODZENIE. Przykładem kodu niepowodzenia jest kopiowanie i wklejanie z podbicia o_O
Vajk Hermecz
4
Błąd @VajkHermecz jest aliasem podniesienia, więc ponownie wykorzystuje dokumentację. Porównaj z dokumentacją dla Array # map i Array # collect
Jamie Macey