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


Respostas:


223

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

def foo
  ...
rescue
  ...
end

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'


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!


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.