Как использовать спасение в Ruby без начального и конечного блоков

115

Я знаю стандартную технику начала спасения

Как можно просто использовать спасательный блок сам по себе.

Как это работает и как узнать, какой код отслеживается?

Sid
источник

Ответы:

223

Метод def может служить оператором начала:

def foo
  ...
rescue
  ...
end
alex.zherdev
источник
3
Кроме того, определения классов, определения модулей и (я думаю) do/ endблочные литералы образуют неявные блоки исключений.
Jörg W Mittag,
Можете ли вы сделать спасение def, чтобы гарантировать конец?
Мохамед Хафез
Вы можете абсолютно точно сделать спасение def, гарантировать конец :-)
Энтони
вы можете использовать более одного спасения в вашем def?
женат
@ marriedjane875 да , вы можете использовать несколько выручает, либо в явном виде (каждый пункт спасательного / блок на своей собственной линии) , как rescue TypeError; rescue NameError- или вы можете запятую отдельных классов исключений, напримерrescue TypeError, NameError
chemturion
48

Вы также можете спасти встроенные:

1 + "str" rescue "EXCEPTION!"

распечатает "ИСКЛЮЧЕНИЕ!" так как 'String не может быть преобразован в Fixnum'

peku
источник
1
Как вы спасаете и показываете трассировку исключения в строке?
Сирил Дюшон-Дорис
как вернуть фактическое исключение?
user1735921
1
Встроенное спасение не является хорошей практикой, поскольку оно спасает StandardErrorи все его подклассы, например NameError- это означает, что даже опечатка в вашем коде не вызовет ошибку. См. Thinkbot.com/blog/don-t-inline-rescue-in- рубин .
BrunoFacca
26

Я часто использую комбинацию def / rescue с проверками 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
Хиеу Ле
источник