Como usar o resgate em Ruby sem o bloco inicial e final

115

Eu conheço a técnica padrão de iniciar o resgate

Como alguém usa o bloco de resgate sozinho.

Como funciona e sabe qual código está sendo monitorado?

Sid
fonte

Respostas:

223

Um método "def" pode servir como uma declaração de "início":

def foo
  ...
rescue
  ...
end
alex.zherdev
fonte
3
Além disso, as definições de classe, definições de módulo e (eu acho) do/ endliterais de bloco formam blocos de exceção implícitos.
Jörg W Mittag
você pode fazer def resgate e garantir o fim também?
Mohamed Hafez
Você também pode fazer def resgate garantir o fim também :-)
Antony
você pode usar mais de um resgate em sua defesa?
casado com Jane875
@ marriedjane875 sim, você pode usar vários resgates, seja explicitamente (cada cláusula / bloqueio de resgate em sua própria linha) como rescue TypeError; rescue NameError- ou você pode separar as classes de exceção por vírgula, por exemplorescue TypeError, NameError
chemturion
48

Você também pode resgatar inline:

1 + "str" rescue "EXCEPTION!"

irá imprimir "EXCEÇÃO!" já que 'String não pode ser coagida em Fixnum'

peku
fonte
1
Como você resgata e mostra a exceção backtrace inline?
Cyril Duchon-Doris
como retornar a exceção real?
user1735921
1
O resgate em linha não é uma boa prática, pois ele resgata StandardErrore todas as suas subclasses, como NameError- o que significa que até mesmo um erro de digitação em seu código não gerará um erro. Consulte Thoughtbot.com/blog/don-t-inline-rescue-in- rubi .
BrunoFacca
26

Estou usando muito a combinação def / rescue com as validações ActiveRecord:

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

Acho que esse é um código muito enxuto!

Edwin V.
fonte
19

Exemplo:

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

Aqui, defcomo uma begindeclaração:

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
fonte