Jak używać ratowania w Rubim bez bloku początku i końca

115

Znam standardową technikę rozpoczynania ratunkowego końca

Jak po prostu korzystać z samego bloku ratunkowego.

Jak to działa i skąd wie, który kod jest monitorowany?

Sid
źródło

Odpowiedzi:

223

Metoda „def” może służyć jako instrukcja „begin”:

def foo
  ...
rescue
  ...
end
alex.zherdev
źródło
3
Ponadto definicje klas, definicje modułów i (jak sądzę) do/ endliterały blokowe tworzą niejawne bloki wyjątków.
Jörg W Mittag,
czy możesz zrobić def ratunek, aby zapewnić koniec?
Mohamed Hafez
Możesz też absolutnie zrobić def ratunek i zapewnić koniec :-)
Antony
czy możesz użyć więcej niż jednego ratunku w swojej def?
marriedjane875
@ marriedjane875 tak, możesz użyć wielu ratunków, albo jawnie (każda klauzula ratunkowa / blok w osobnym wierszu), jak rescue TypeError; rescue NameError- lub możesz oddzielić klasy wyjątków przecinkami, np.rescue TypeError, NameError
chemturion
48

Możesz także uratować inline:

1 + "str" rescue "EXCEPTION!"

wydrukuje "WYJĄTEK!" ponieważ `` Ciąg nie może być wymuszony na Fixnum ''

peku
źródło
1
Jak uratować i wyświetlić wyjątek śledzenia wstecznego w tekście?
Cyril Duchon-Doris
jak zwrócić rzeczywisty wyjątek?
user1735921
1
Ratowanie wbudowane nie jest dobrą praktyką, ponieważ ratuje StandardErrori wszystkie jego podklasy, na przykład NameError- co oznacza, że ​​nawet literówka w kodzie nie spowoduje błędu. Zobacz thinkbot.com/blog/don-t-inline-rescue-in- rubin .
BrunoFacca
26

Często używam kombinacji def / rescue z walidacją ActiveRecord:

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

Myślę, że to bardzo oszczędny kod!

Edwin V.
źródło
19

Przykład:

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

Tutaj, defjako beginoświadczenie:

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
źródło