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?
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?
A method "def" can serve as a "begin" statement:
def foo
...
rescue
...
end
do
/end
block literals form implicit exception blocks. –
Canna rescue TypeError; rescue NameError
-- or you can comma-separate the exception classes, e.g. rescue TypeError, NameError
–
Thayne You can also rescue inline:
1 + "str" rescue "EXCEPTION!"
will print out "EXCEPTION!" since 'String can't be coerced into Fixnum'
StandardError
and all its subclasses, like NameError
– meaning that even a typo in your code won't raise an error.. See thoughtbot.com/blog/don-t-inline-rescue-in-ruby. –
Moat 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]
© 2022 - 2024 — McMap. All rights reserved.