¿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?


Respuestas:


223

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

def foo
  ...
rescue
  ...
end

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'


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!


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.