Sid
Sid

Reputation: 6264

How does one use rescue in Ruby without the begin and end block

I know of the standard technique of having a begin <some code> rescue <rescue code> end

How does one just use the rescue block on its own?

How does it work, and how does it know which code is being monitored?

Upvotes: 136

Views: 50861

Answers (5)

Purplejacket
Purplejacket

Reputation: 2138

Bonus! You can also do this with other sorts of blocks. E.g.:

[1, 2, 3].each do |i|
  if i == 2
    raise
  else
    puts i
  end
rescue
  puts 'got an exception'
end

Outputs this in irb:

1
got an exception
3
 => [1, 2, 3]

Upvotes: 6

Hieu Le
Hieu Le

Reputation: 2136

Example:

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

Here, def as a begin statement:

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

Upvotes: 24

Edwin V.
Edwin V.

Reputation: 1377

I'm using the def / rescue combination a lot with ActiveRecord validations:

def create
   @person = Person.new(params[:person])
   @person.save!
   redirect_to @person
rescue ActiveRecord::RecordInvalid
   render :action => :new
end

I think this is very lean code!

Upvotes: 31

peku
peku

Reputation: 5103

You can also rescue inline:

1 + "str" rescue "EXCEPTION!"

will print out "EXCEPTION!" since 'String can't be coerced into Fixnum'

Upvotes: 53

alex.zherdev
alex.zherdev

Reputation: 24174

A method "def" can serve as a "begin" statement:

def foo
  ...
rescue
  ...
end

Upvotes: 261

Related Questions