¿Qué hace la palabra clave fail en Ruby?

88

Estoy aprendiendo Ruby y encontré la failpalabra clave. Qué significa eso?

if password.length < 8
   fail "Password too short"
end
unless  username
   fail "No user name set"
end
Sueños
fuente
8
Además de las siguientes respuestas, vale la pena saber que la gente usa raisecuando maneja excepciones y failcuando no.
Bala
6
No es una palabra clave, es un método.
Jörg W Mittag
Documentación: Kernel # fail
Jared Beck
También tenga en cuenta que puede escribirlos como declaraciones de una sola línea: fail "Password too short" if password.length < 8yfail "No user name set" unless username
PhilT

Respuestas:

136

En Ruby, failes sinónimo de raise. La failpalabra clave es un método del Kernelmódulo incluido por la clase Object. El failmétodo genera un error en tiempo de ejecución al igual que la raisepalabra clave.

El failmétodo tiene tres sobrecargas:

  • fail: genera un RuntimeErrorsin mensaje de error.

  • fail(string): genera un RuntimeErrorcon el argumento de cadena como mensaje de error:

    fail "Failed to open file"
    
  • fail(exception [, string [, array]]): genera una excepción de clase exception(primer argumento) con un mensaje de error opcional (segundo argumento) e información de devolución de llamada (tercer argumento).

    Ejemplo: suponga que define una función que debería fallar si se le da un argumento incorrecto. Es mejor plantear un ArgumentErrory no un RuntimeError:

    fail ArgumentError, "Illegal String"
    

    Otro ejemplo: puede pasar todo el retroceso al failmétodo para poder acceder al rastro dentro del rescuebloque:

    fail ArgumentError, "Illegal String", caller
    

    calleres un método de Kernel que devuelve el backtrace como una matriz de cadenas en el formulario file:line: in 'method'.

Sin argumentos, plantea la excepción en $! o genera un RuntimeError si $! es nulo. Con un solo argumento String, genera un RuntimeError con la cadena como mensaje. De lo contrario, el primer parámetro debe ser el nombre de una clase de excepción (o un objeto que devuelve un objeto de excepción cuando se envía un mensaje de excepción). El segundo parámetro opcional establece el mensaje asociado con la excepción y el tercer parámetro es una matriz de información de devolución de llamada. Las excepciones están incluidas en la cláusula de rescate de los bloques begin ... end.

Fuente: Documentación de Ruby sobre el módulo Kernel .

crazybob
fuente
2
¿Puede dar 3 ejemplos sencillos con las 3 viñetas? Hará que su respuesta sea más concreta .. :)
Arup Rakshit
1
Wow, +1, crazybob es mejor que Ruby docs ruby-doc.org/core-2.0.0/Kernel.html#method-i-raise :-)))
Boris Stitnicky
Me funcionó, pero Rubocop lo convirtió enraise
paul
32

Rubocop dice sobre el uso de ambas palabras;

'Úselo en faillugar de raisepara señalar excepciones'.

'Usar en raiselugar de failvolver a lanzar excepciones'.

Aquí hay un ejemplo.

def sample
  fail 'something wrong' unless success?
rescue => e
  logger.error e
  raise
end
kuboon
fuente
+1 para asesoramiento de estilo; incluso si son idénticos semánticamente, el uso de cada uno en su entorno previsto ayuda a transmitir mejor la intención
fatuhoku
26

fail == raise

En otras palabras, failes solo un alias popular para el raisemétodo de generación de errores. Uso:

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

www.ruby-doc.org es tu amigo. Cuando busqué en Google, rubydoc fail" Kernel " fue el primer éxito. Mi consejo es, en caso de duda, acudir a la fuente definitiva para obtener información sobre definiciones como esta.

pjs
fuente
2
Woot, eso realmente es un FALLO. El ejemplo de código para fallar es copiar y pegar de raise o_O
Vajk Hermecz
4
@VajkHermecz fail es un alias de raise, por lo que reutiliza la documentación. Compare con los documentos de Array # map y Array # collect
Jamie Macey