Cosa fa la parola chiave fail in Ruby?


88

Sto imparando Ruby e ho incontrato la failparola chiave. Cosa significa?

if password.length < 8
   fail "Password too short"
end
unless  username
   fail "No user name set"
end

9
Oltre alle risposte seguenti, vale la pena sapere che le persone usano raisequando gestiscono le eccezioni e failquando no.
Bala

6
Non è una parola chiave, è un metodo.
Jörg W Mittag

Documentazione: Kernel # fail
Jared Beck

Nota anche che puoi scrivere queste dichiarazioni come singole righe: fail "Password too short" if password.length < 8efail "No user name set" unless username
PhilT

Risposte:


137

In Ruby, failè sinonimo di raise. La failparola chiave è un metodo del Kernelmodulo incluso nella classe Object. Il failmetodo genera un errore di runtime proprio come la raiseparola chiave.

Il failmetodo ha tre overload:

  • fail: solleva a RuntimeErrorsenza un messaggio di errore.

  • fail(string): solleva un RuntimeErrorcon l'argomento stringa come messaggio di errore:

    fail "Failed to open file"
    
  • fail(exception [, string [, array]]): solleva un'eccezione di classe exception(primo argomento) con un messaggio di errore opzionale (secondo argomento) e informazioni di callback (terzo argomento).

    Esempio: supponiamo di definire una funzione che dovrebbe fallire se viene fornito un argomento errato. È meglio sollevare una ArgumentErrore non una RuntimeError:

    fail ArgumentError, "Illegal String"
    

    Un altro esempio: puoi passare l'intero backtrace al failmetodo in modo da poter accedere alla traccia all'interno del rescueblocco:

    fail ArgumentError, "Illegal String", caller
    

    callerè un metodo del kernel che restituisce il backtrace come un array di stringhe nel modulo file:line: in 'method'.

Senza argomenti, solleva l'eccezione in $! o solleva un'eccezione RuntimeError se $! è nullo. Con un singolo argomento String, solleva un'eccezione RuntimeError con la stringa come messaggio. In caso contrario, il primo parametro dovrebbe essere il nome di una classe Exception (o un oggetto che restituisce un oggetto Exception quando viene inviato un messaggio di eccezione). Il secondo parametro facoltativo imposta il messaggio associato all'eccezione e il terzo parametro è una matrice di informazioni di callback. Le eccezioni vengono rilevate dalla clausola di salvataggio dei blocchi di inizio ... fine.

Fonte: documentazione Ruby sul modulo kernel .


2
Puoi fornire 3 semplici esempi con i 3 punti elenco?
Renderà la

1
Wow, +1, crazybob è meglio di Ruby docs ruby-doc.org/core-2.0.0/Kernel.html#method-i-raise :-)))
Boris Stitnicky

Ha funzionato per me, ma Rubocop l'ha convertito inraise
paul

32

Rubocop dice sull'uso di entrambe le parole;

"Utilizzare failinvece di raiseper segnalare eccezioni."

"Utilizzare raiseinvece di failrilanciare le eccezioni."

Ecco un esempio.

def sample
  fail 'something wrong' unless success?
rescue => e
  logger.error e
  raise
end

+1 per consulenza sullo stile; anche se sono identici semanticamente, l'uso di ciascuno nell'impostazione prevista aiuta a trasmettere meglio l'intenzione
fatuhoku

26

fail == raise

In altre parole, failè solo un popolare alias per raiseil metodo di generazione degli errori. Utilizzo:

fail ArgumentError, "Don't argue with me!"

7

www.ruby-doc.org è tuo amico. Quando ho cercato su Google rubydoc fail" Kernel " è stato il primo successo. Il mio consiglio è, in caso di dubbio, di andare alla fonte definitiva per cose definitive come questa.


2
Woot, questo è davvero un FAIL. Un esempio di codice per fallire è copia-incolla da raise o_O
Vajk Hermecz

4
@VajkHermecz fail è un alias di raise, quindi riutilizza la documentazione. Confronta con i documenti per Array # map e Array # collect
Jamie Macey
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.