¿Cómo se usa el rescate en Ruby sin el bloque de inicio y fin?

115

Conozco la técnica estándar de tener un comienzo de rescate final

¿Cómo se usa el bloque de rescate por sí solo?

¿Cómo funciona y cómo sabe qué código se está monitoreando?

Sid
fuente

Respuestas:

223

Un método "def" puede servir como una declaración de "comienzo":

def foo
  ...
rescue
  ...
end
alex.zherdev
fuente
3
Además, las definiciones de clase, las definiciones de módulo y (creo) do/ endliterales de bloque forman bloques de excepción implícitos.
Jörg W Mittag
¿Puedes hacer definitivamente el rescate asegurar el final también?
Mohamed Hafez
Definitivamente puede hacer definitivamente el rescate, asegurar el final también :-)
Antony
¿Puedes usar más de un rescate en tu definición?
casadojane875
@ marriedjane875 sí, puede usar múltiples rescates, ya sea explícitamente (cada cláusula / bloque de rescate en su propia línea) como rescue TypeError; rescue NameError, o puede separar por comas las clases de excepción, por ejemplorescue TypeError, NameError
chemturion
48

También puede rescatar en línea:

1 + "str" rescue "EXCEPTION!"

imprimirá "¡EXCEPCIÓN!" ya que 'String no se puede forzar a Fixnum'

peku
fuente
1
¿Cómo se rescata y muestra el rastreo inverso de excepción en línea?
Cyril Duchon-Doris
¿Cómo devolver la excepción real?
user1735921
1
El rescate en línea no es una buena práctica, ya que rescata StandardErrory todas sus subclases, como NameError, lo que significa que incluso un error tipográfico en su código no generará un error. Consulte thinkbot.com/blog/don-t-inline-rescue-in- rubí .
BrunoFacca
26

Estoy usando mucho la combinación def / rescue con las validaciones de ActiveRecord:

def create
   @person = Person.new(params[:person])
   @person.save!
   redirect_to @person
rescue ActiveRecord::RecordInvalid
   render :action => :new
end

¡Creo que este es un código muy ajustado!

Edwin V.
fuente
19

Ejemplo:

begin
  # something which might raise an exception
rescue SomeExceptionClass => some_variable
  # code that deals with some exception
ensure
  # ensure that this code always runs
end

Aquí, a defmodo de begindeclaración:

def
  # something which might raise an exception
rescue SomeExceptionClass => some_variable
  # code that deals with some exception
ensure
  # ensure that this code always runs
end
Hieu Le
fuente