Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

In Ruby, What structures can a `rescue` statement be nested in

In ruby to catch an error one uses the rescue statement. generally this statement occurs between begin and end. One can also use a rescue statement as part of a block (do ... end) or a method (def ... end). My question is what other structures (loop, while, if, ...) if any will rescue nest within?

like image 965
John F. Miller Avatar asked Mar 26 '10 16:03

John F. Miller


2 Answers

You can only use rescue in two cases:

  • Within a begin ... end block

    begin   raise rescue    nil end 
  • As a statement modifier

    i = raise rescue nil 

Function, module, and class bodies (thanks Jörg) are implicit begin...end blocks, so you can rescue within any function without an explicit begin/end.

    def foo       raise     rescue       nil     end 

The block form takes an optional list of parameters, specifying which exceptions (and descendants) to rescue:

    begin       eval string     rescue SyntaxError, NameError => boom       print "String doesn't compile: " + boom     rescue StandardError => bang       print "Error running script: " + bang     end 

If called inline as a statement modifier, or without argument within a begin/end block, rescue will catch StandardError and its descendants.

Here's the 1.9 documentation on rescue.

like image 161
klochner Avatar answered Sep 21 '22 04:09

klochner


As said in recent comment, response has changed since Ruby 2.5.

do ... end blocks are now implicit begin ... end blocks; like module, class and method bodies.

In-line blocks {...} still can't.

like image 26
pimpin Avatar answered Sep 23 '22 04:09

pimpin