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


Odpowiedzi:


223

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

def foo
  ...
rescue
  ...
end

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


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!


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.