Як користуватися рятуванням у Ruby без блоку початку та кінця


115

Я знаю про стандартну техніку початку закінчення рятування

Як просто використовувати рятувальний блок самостійно.

Як це працює і як він знає, за яким кодом контролюється?


Відповіді:


223

Метод "def" може служити твердженням "begin":

def foo
  ...
rescue
  ...
end

3
Також визначення класів, визначення модулів та (я думаю) do/ endблокові літерали утворюють неявні блоки виключень.
Йорг W Міттаг

Чи можете ви зробити порятунок Def забезпечити кінець також?
Мохамед Хафез

Ви можете абсолютно не врятувати захист, щоб забезпечити закінчення :-)
Антоній

Ви можете використовувати більше, ніж один рятувальник у вашій обороні?
одружений875

@ marriedjane875 так, ви можете використовувати декілька рятувальників, явно (кожен рятувальний пункт / блок у власному рядку), наприклад, rescue TypeError; rescue NameError- або ви можете розділити комами винятки класи, наприкладrescue TypeError, NameError
chemturion

48

Ви також можете врятувати вбудований:

1 + "str" rescue "EXCEPTION!"

роздрукує "ВИХІД!" оскільки "String не можна примусити до Fixnum"


1
Як ви врятуєте та покажете обертання виключень у прямому напрямку?
Кирило Духон-Доріс

як повернути фактичний виняток?
користувач1735921

1
Вбудований порятунок не є хорошою практикою, оскільки він рятує StandardErrorі всі його підкласи, наприклад NameError- це означає, що навіть помилка друку у вашому коді не призведе до помилки. Див. Thinkbot.com/blog/don-t-inline-rescue-in- рубін .
BrunoFacca

26

Я багато використовую комбінацію def / рятування з перевіркими ActiveRecord:

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

Я думаю, що це дуже худий код!


19

Приклад:

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

Ось defяк beginтвердження:

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.