开发者

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

开发者 https://www.devze.com 2022-12-08 06:50 出处:网络
I know of the standard technique of having a beginrescueend How does one just use the rescue block on its own.

I know of the standard technique of having a begin rescue 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 mon开发者_如何学编程itored?


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

def foo
  ...
rescue
  ...
end


You can also rescue inline:

1 + "str" rescue "EXCEPTION!"

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


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!


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


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]
0

精彩评论

暂无评论...
验证码 换一张
取 消