Come si usa il salvataggio in Ruby senza il blocco di inizio e fine


115

Conosco la tecnica standard di avere una fine di salvataggio iniziale

Come si usa il blocco di salvataggio da solo.

Come funziona e come fa a sapere quale codice viene monitorato?


Risposte:


223

Un metodo "def" può servire come un'istruzione "begin":

def foo
  ...
rescue
  ...
end

3
Inoltre, le definizioni di classe, le definizioni di modulo e (credo) do/ i endvalori letterali di blocco formano blocchi di eccezioni implicite.
Jörg W Mittag

puoi fare anche il def rescue per garantire la fine?
Mohamed Hafez

Puoi assolutamente fare il def rescue assicurandoti anche la fine :-)
Antony

puoi usare più di un salvataggio nella tua def?
marriedjane875

@ marriedjane875 sì, puoi utilizzare più salvataggi, sia esplicitamente (ogni clausola di salvataggio / blocco su una propria riga) come rescue TypeError; rescue NameError- oppure puoi separare le classi di eccezione con virgole, ad esempiorescue TypeError, NameError
chemturion

48

Puoi anche salvare in linea:

1 + "str" rescue "EXCEPTION!"

stamperà "ECCEZIONE!" poiché "La stringa non può essere forzata in Fixnum"


1
Come si salva e si mostra il backtrace dell'eccezione in linea?
Cyril Duchon-Doris

come restituire l'eccezione effettiva?
user1735921

1
Il salvataggio in linea non è una buona pratica in quanto salva StandardErrore tutte le sue sottoclassi, come NameError- il che significa che anche un errore di battitura nel tuo codice non solleverà un errore .. Vedi thoughtbot.com/blog/don-t-inline-rescue-in- rubino .
BrunoFacca

26

Sto usando molto la combinazione def / rescue con le convalide di ActiveRecord:

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

Penso che questo sia un codice molto snello!


19

Esempio:

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

Ecco, defcome una begindichiarazione:

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
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.