3 ответов:
Я думаю http://hasno.info/ruby-gotchas-and-caveats имеет достойное объяснение разницы:
поймать / бросить не то же самое, что поднять/спасти. catch / throw позволяет быстро выходить из блоков обратно в точку, где catch определен для определенного символа, raise rescue-это реальный материал обработки исключений, включающий объект исключения.
raise,fail,rescueиensureдескриптор ошибки, также известный как исключенияthrowиcatchare поток управленияв отличие от других языки, Руби throw и catch не используются для исключения. Вместо этого они предоставляют способ досрочного завершения выполнения, когда нет необходима дальнейшая работа. (Grimm, 2011)
завершение один уровень потока управления, например
whileцикл, можно сделать с помощью простогоreturn. Завершение многих уровней потока управления, таких как вложенный цикл, можно выполнить с помощьюthrow.хотя механизм исключения raise и rescue отлично подходит для отказа от выполнения, когда все идет не так, иногда приятно иметь возможность выпрыгнуть из какой-то глубоко вложенной конструкции во время обычной обработки. Это где поймать и бросить пригодится. (Томас и Хант, 2001)
ссылки
- Гримм, Авди. "Бросай, Лови, поднимай, спасай... я так запуталась!"Блог RubyLearning. Н. П., 11 июля 2011 года. Сеть. 1 января. 2012. http://rubylearning.com/blog/2011/07/12/throw-catch-raise-rescue--im-so-confused/.
- Томас, Дэйв и Эндрю Хант. - Программирование Руби.": Руководство прагматичного программиста. N. p., 2001. Сеть. 29 сентября. 2015. http://ruby-doc.com/docs/ProgrammingRuby/html/tut_exceptions.html.
https://coderwall.com/p/lhkkug/don-t-confuse-ruby-s-throw-statement-with-raise предлагает отличное объяснение, которое я сомневаюсь, что могу улучшить. Подводя итог, отмечу некоторые примеры кода из сообщения в блоге, когда я иду:
raise/rescueявляются ближайшими аналогамиthrow/catchпостроить вы знакомы с другими языками (или на Pythonraise/except). Если вы столкнулись с условием ошибки, и вы быthrowнад ним на другом языке, вы должныraiseв Руби.Рубин
throw/catchпозволяет прервать выполнение и подняться вверх по стеку ищемcatch(типаraise/rescueделает), но на самом деле не предназначен для условий ошибки. Он должен использоваться редко, и есть только для того, когда " поднимитесь по стеку, пока не найдете соответствующийcatch" поведение имеет смысл для алгоритма, который вы пишете, но не имеет смысла думать оthrowкак соответствует условию ошибки.для чего используется catch and throw в Ruby? предлагает некоторые предложения по хорошему использованию
throw/catchстроительство.конкретные поведенческие различия между ними включают в себя:
rescue Fooспасет экземпляровFooв том числе подклассыFoo.catch(foo)только поймать один и тот же объект,Foo. Не только вы не можете пасcatchимя класса, чтобы поймать его экземпляры, но он даже не будет делать сравнения равенства. Например,catch("foo") do throw "foo" endвы
UncaughtThrowError: uncaught throw "foo"(илиArgumentErrorв версиях Ruby до 2.2)несколько пунктов спасения могут быть перечислены...
begin do_something_error_prone rescue AParticularKindOfError # Insert heroism here. rescue write_to_error_log raise endв то время как несколько
catches должны быть вложенными...catch :foo do catch :bar do do_something_that_can_throw_foo_or_bar end endголой
rescueэквивалентноrescue StandardErrorи является идиоматической конструкцией. Один - голыйcatch", какcatch() {throw :foo}, никогда ничего не поймает и не должен использоваться.
Comments