Begin...rescue...retry next?

Is there some way to do this in Ruby?

begin
  # do stuff, uh-oh an exception gets raised
rescue
  retry next
end

There's 'retry' which returns to the same statement that threw the
exception, but I'd like execution to resume at the next statement
following it.

Thanks,
Joe

···

--
Posted via http://www.ruby-forum.com/.

There's 'retry' which returns to the same statement that threw the
exception, but I'd like execution to resume at the next statement
following it.

not_tried_before = true
begin
   do_dangerous_stuff if not_tried_before
rescue
   not_tried_before = false
   retry
end

Max

If you know only expression X will raise the exception you can use the modifier form

some_code
some_exception_raising_call rescue nil # This is evil
continue_blissfully_unaware_of_whether_an_exception_was_raised

Also retry does not return to the statement that raised the exception, it jumps to the begin

begin
   # retry will put you here
   some_code
   some_more_code
   raise_an_exception
   even_more_code
rescue
   retry
end

···

On Aug 15, 2006, at 10:26 PM, Joe Ruby wrote:

Is there some way to do this in Ruby?

begin
  # do stuff, uh-oh an exception gets raised
rescue
  retry next
end

There's 'retry' which returns to the same statement that threw the
exception, but I'd like execution to resume at the next statement
following it.

Thanks,
Joe

-- Posted via http://www.ruby-forum.com/\.

Logan Capaldo wrote:

some_exception_raising_call rescue nil # This is evil

Why is that evil?

Joe

···

--
Posted via http://www.ruby-forum.com/\.

Cause you can't specify which exceptions to catch with that form. Someday something terrible could happen inside some_exception_raising_call that you _do_ want to know about but it'll just get thrown away by the rescue nil.

···

On Aug 16, 2006, at 12:41 AM, Joe Ruby wrote:

Logan Capaldo wrote:

some_exception_raising_call rescue nil # This is evil

Why is that evil?

Joe

-- Posted via http://www.ruby-forum.com/\.

Joe Ruby wrote:

Logan Capaldo wrote:
  

some_exception_raising_call rescue nil # This is evil
    
Why is that evil?

Joe
  
Because if something goes wrong in that call, you will get no information about it. Won't even know it happened.

-Justin

Justin Collins wrote:

Joe Ruby wrote:

Logan Capaldo wrote:
  

some_exception_raising_call rescue nil # This is evil
    
Why is that evil?

Joe
  
Because if something goes wrong in that call, you will get no
information about it. Won't even know it happened.

-Justin

Yeah, but rescue nil is just usually to deal with null values from the
database, for example, which isn't a big deal.

Joe

···

--
Posted via http://www.ruby-forum.com/\.

Joe Ruby wrote:

Justin Collins wrote:
  

Joe Ruby wrote:
    

Logan Capaldo wrote:
  

some_exception_raising_call rescue nil # This is evil
    

Why is that evil?

Joe
  

Because if something goes wrong in that call, you will get no
information about it. Won't even know it happened.

-Justin
    
Yeah, but rescue nil is just usually to deal with null values from the database, for example, which isn't a big deal.

Jo

Using rescue this way will rescue all exceptions, but simply return nil.
Examples:

irb(main):001:0> puts a rescue nil
=> nil
irb(main):002:0> puts "asiodhasd".asdiajsd rescue nil
=> nil
irb(main):003:0> asdi.asdiojas.asidjas.asdihja.asdijasd rescue nil
=> nil
irb(main):004:0>

It's better, as I think Logan was implying, to rescue a specific exception if you are expecting it. That way, you will see if other exceptions occur.

Sorry if I misunderstood your reply.

-Justin

Aaahhh...all this time I thought I was rescuing nil rather than rescuing
everything and returning nil!

Joe

···

--
Posted via http://www.ruby-forum.com/.