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


115

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

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

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


Ответы:


223

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

def foo
  ...
rescue
  ...
end

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'


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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.