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 ''
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 @personrescueActiveRecord::RecordInvalid
render :action =>:new
end
begin# something which might raise an exceptionrescueSomeExceptionClass=> some_variable
# code that deals with some exceptionensure# ensure that this code always runsend
Tutaj, defjako beginoświadczenie:
def# something which might raise an exceptionrescueSomeExceptionClass=> some_variable
# code that deals with some exceptionensure# ensure that this code always runsend
Odpowiedzi:
Metoda „def” może służyć jako instrukcja „begin”:
źródło
do
/end
literały blokowe tworzą niejawne bloki wyjątków.rescue TypeError; rescue NameError
- lub możesz oddzielić klasy wyjątków przecinkami, np.rescue TypeError, NameError
Możesz także uratować inline:
wydrukuje "WYJĄTEK!" ponieważ `` Ciąg nie może być wymuszony na Fixnum ''
źródło
StandardError
i wszystkie jego podklasy, na przykładNameError
- co oznacza, że nawet literówka w kodzie nie spowoduje błędu. Zobacz thinkbot.com/blog/don-t-inline-rescue-in- rubin .Często używam kombinacji def / rescue z walidacją ActiveRecord:
Myślę, że to bardzo oszczędny kod!
źródło
Przykład:
Tutaj,
def
jakobegin
oświadczenie:źródło